Android 数据库助手单例 - 在 activity 或所有片段中实例化?
Android database helper singleton - instantiate in activity or all fragments?
我有一个 DBHelper class 设置为单例:
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())
吗?由于单例模式,实例化只会发生一次,所以我不必担心 class 在每个带有该代码的片段中被实例化
还是仅在 MainActivity
中实例化 DBHelper 更好,然后在任何需要数据库访问的片段中获取对 mainactivity 的引用并从那里调用对象方法?每个片段中都有这样的内容:
mainActivity = (MainActivity) getActivity();
mainActivity.dbHelper.insertData();
我认为最有成效的决定是创建自定义片段 class,将其扩展到您的片段或 v4.fragment,在其中初始化 dbHelper 并在您的 activity 中使用您的自定义片段。这是我的拙见:)
这里的代码是解决单例模式中并发问题的一种简单方法。
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();
既然你确定 Singleton 将在 MainActivity 中实例化,第一种方法应该没有任何问题,你甚至可以在你的片段中调用 getInstance(null)
我有一个 DBHelper class 设置为单例:
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())
吗?由于单例模式,实例化只会发生一次,所以我不必担心 class 在每个带有该代码的片段中被实例化
还是仅在 MainActivity
中实例化 DBHelper 更好,然后在任何需要数据库访问的片段中获取对 mainactivity 的引用并从那里调用对象方法?每个片段中都有这样的内容:
mainActivity = (MainActivity) getActivity();
mainActivity.dbHelper.insertData();
我认为最有成效的决定是创建自定义片段 class,将其扩展到您的片段或 v4.fragment,在其中初始化 dbHelper 并在您的 activity 中使用您的自定义片段。这是我的拙见:)
这里的代码是解决单例模式中并发问题的一种简单方法。
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();
既然你确定 Singleton 将在 MainActivity 中实例化,第一种方法应该没有任何问题,你甚至可以在你的片段中调用 getInstance(null)