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)