Ho un'app in cui l'utente può creare/eliminare/modificare un elenco da un DialogFragment. Prima avevo un metodo come questo nel mio DialogFragments: MainActivtity.adapter.add(String name, String location, double price);
Ho usato Singleton con Realm Database corretto?
adapter
è il mio oggetto adattatore per recyclerView. La classe dell'adattatore aveva i miei metodi di creazione/cancellazione/modifica per gli elementi in recyclerView. Che è stato chiamato come mostrato sopra, che è anche un modo orribile per chiamare i mehtod come capisco.
Così ho scelto di mettere tutti questi metodi CRUD in una classe Singleton e chiamare questi metodo come questo: Service.getInstance().add(...);
È questo un approccio corretto e quello che avrei potuto fare meglio?
Ecco come ho creato la classe singleton che ora contiene i miei metodi CRUD, invece di inserirli nella mia classe dell'adattatore per il recyclerView come prima.
public class Service {
private static Realm realm;
private static Service service = new Service();
private Service() {
realm = Realm.getInstance(App.getAppContex());
}
public static Service getInstance(){
if(service == null){
service = new Service();
}
return service;
}
public void add(String name, String location, double price) {
ShopListItem shopListItem = new ShopListItem();
shopListItem.setName(name);
shopListItem.setLocation(location);
shopListItem.setPrice(price);
shopListItem.setTimestamp(System.currentTimeMillis());
shopListItem.setIsBought(0);
realm.beginTransaction();
realm.copyToRealm(shopListItem);
realm.commitTransaction();
}
public void removeItem(int position, List<ShopListItem> shopListItems) {
realm.beginTransaction();
shopListItems.remove(position);
realm.commitTransaction();
}
Questa classe è solo utilizzato per ottenere il contesto globale/Application
public class App extends Application {
public static Application sApplication;
public static Application getsApplication(){
return sApplication;
}
public static Context getAppContex(){
return getsApplication();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}
}
domanda aggiornato da qui:
Ecco il nuovo approccio sulla base dei suggerimenti dai commenti: Ora everytim e Voglio fare un'operazione CRUD nel Realm Database, comincio sempre con getDefaultInstance per il mio oggetto realm e la fine di con realm.close(); questo processo viene risolto in ogni metodo CRUD.
public class Service {
private Realm realm;
private static Service service = new Service();
private Service() {
}
public static Service getInstance(){
if(service == null){
service = new Service();
}
return service;
}
public void removeItem(int position, List<ShopListItem> shopListItems) {
//new: realm = Realm.getDefaultInstance();
realm = Realm.getDefaultInstance();
realm.beginTransaction();
shopListItems.remove(position);
realm.commitTransaction();
realm.close();
//new: realm.close();
}
configurazioni Realm è ora spostato alla mia classe di applicazione, come suggerito dal Regno.
public class App extends Application {
public static Application sApplication;
public static Application getsApplication(){
return sApplication;
}
public static Context getAppContex(){
return getsApplication();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
final RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(App.getAppContex()).build();
realm.setDefaultConfiguration(realmConfiguration);
}
}
Dove si chiude l'istanza reame? –
Un pattern singleton è generalmente pericoloso, specialmente se si accede al singleton da thread diversi. Consulta queste due sezioni nei documenti per ulteriori informazioni su come gestire il ciclo di vita di Realm: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances e https: // realm.io/docs/java/latest/#closing-realm-instances –
@TimCastelijns nei miei metodi onDestroy. – Muddz