我将DBHelper类设置为单例:
public class DBHelper extends SQLiteOpenHelper {
private static DBHelper sInstance;
public static synchronized DBHelper getInstance(Context context) {
if (sInstance == null) {
sInstance = new DBHelper(context.getApplicationContext());
}
return sInstance;
}
private DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
databasePath = context.getDatabasePath(DATABASE_NAME).getPath();
}
}
我有一个MainActivity
和一些片段。其中许多片段需要访问我的DBHelper方法
我是否应该在每个需要数据库访问的片段中使用dbHelper = DBHelper.getInstance(getApplicationContext())
?由于单例模式,实例化只会发生一次,因此我不需要担心使用该代码在每个单独的片段中实例化类
或者仅在MainActivity
中实例化DBHelper更好,然后在需要数据库访问的任何片段中获取对mainactivity的引用并从那里调用对象方法?每个片段都有这样的东西:
mainActivity = (MainActivity) getActivity();
mainActivity.dbHelper.insertData();
答案 0 :(得分:2)
由于您确定Singleton将在MainActivity中实例化,因此第一种方法不应该有任何问题,您甚至可以在片段中调用getInstance(null)
答案 1 :(得分:1)
我认为最常见的决定是创建自定义片段类,将其扩展为片段或v4.fragment,在其中初始化dbHelper并在您的活动中使用自定义片段。这是我的拙见:)
答案 2 :(得分:1)
这里的代码是解决单例模式中并发问题的一种简单方法。
public DBHelper extends SQLiteOpenHelper {
// declare private constructor
// some public method
public static class Wrapper {
private static DBHelper dbHelper;
public static void init(Context ctx, Object otherArgs) {
// init DBHelper
dbHelper = new DBHelper(ctx, otherArgs);
}
public static DBHelper get(){
return dbHelper;
}
}
}
在自定义应用程序
中public MyApp extends Application{
void onCreate(){
DBHelper.Wrpper.init(this, otherArgs);
}
}
这样的代码需要DBHelper:
DBHelper.Wrapper.get().insertData();