Ich habe eine App, wo der Benutzer zu einer Liste von einem DialogFragment erstellen/löschen/bearbeiten kann. Bevor ich eine Methode wie diese in meinem DialogFragments hatte: MainActivtity.adapter.add(String name, String location, double price);
Habe ich Singleton mit Realm Database korrekt verwendet?
adapter
ist mein Adapter-Objekt für die RecyclerView. Die Klasse für den Adapter hatte meine Methoden create/delete/edit für die Elemente in der recyclerView. Das wurde wie oben gezeigt genannt, was auch eine schreckliche Art ist, Mehtods so zu bezeichnen, wie ich es verstehe.
So wähle ich alle diese CRUD Methoden in einer Singleton-Klasse zu setzen und diese Methode wie folgen nennen: Service.getInstance().add(...);
Ist das ein richtiger Ansatz, und was könnte ich besser machen kann?
So habe ich die Singleton-Klasse erstellt, die nun meine CRUD-Methoden enthält, anstatt sie wie bisher in meine Adapterklasse für den RecyclerView einzufügen. ist
Hier den neuen Ansatz auf Vorschläge basieren:
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();
}
Diese Klasse wird für das Erhalten der globalen/Anwendungskontext
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;
}
}
Frage aktualisiert von hier nur verwendet von den Kommentaren: Jetzt Evertimtim e Ich möchte eine CRUD-Operation in der Realm-Datenbank machen, ich beginne immer mit der getDefaultInstance für mein Realm-Objekt und beende mit realm.close(); Dieser Prozess wird in jeder CRUD-Methode angepasst.
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();
}
Realm Konfigurationen wird nun auf meine Anwendungsklasse bewegt, wie durch Realm vorgeschlagen.
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);
}
}
Wo Sie das Reich Instanz schließen Sie? –
Ein Singleton-Muster ist im Allgemeinen gefährlich, besonders wenn Sie auf das Singleton von verschiedenen Threads zugreifen. Weitere Informationen zum Umgang mit dem Realm-Lebenszyklus finden Sie in den beiden folgenden Abschnitten in den Dokumenten: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances und https: // realm.io/docs/java/latest/#closing-realm-instances –
@TimCastelijns in meinen OnDestroy-Methoden. – Muddz