gpt4 book ai didi

java - 我使用 Singleton 和 Realm Database 是否正确?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:21 26 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中创建/删除/编辑来自 DialogFragment 的列表。在我的 DialogFragments 中有这样的方法之前:MainActivtity.adapter.add(String name, String location, double price);

adapter 是我的 recyclerView 适配器对象。适配器的类具有我对 recyclerView 中的项目的创建/删除/编辑方法。它的调用方式如上所示,据我所知,这也是一种可怕的调用方法的方式。

所以我选择将所有这些 CRUD 方法放在一个单例类中,并像这样调用这些方法:Service.getInstance().add(...);

这是正确的方法吗?我还可以做得更好吗?

这就是我创建现在包含我的 CRUD 方法的单例类的方式,而不是像以前那样将它们放在我的 recyclerView 适配器类中。

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();
}

此类仅用于获取全局/应用程序上下文

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;
}
}

问题从这里更新:

以下是基于评论建议的新方法:现在每次我想在 Realm 数据库中进行 CRUD 操作时,我总是从我的 Realm 对象的 getDefaultInstance 开始,并以 realm.close() 结束;这个过程在每个 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();
}

按照 Realm 的建议,Realm 配置现已移至我的应用程序类。

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);
}
}

最佳答案

您根本不应该将 Realm 与单例一起使用。由于 Realm 是面向线程的。您应该打开新的默认实例并将其关闭。

或者您可以使用 threadId 与 Realm 对象的映射。其中线程是弱引用。

关于java - 我使用 Singleton 和 Realm Database 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37768882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com