Android数据库帮助程序单例 - 在活动或所有片段中实例化?

时间:2016-04-04 09:26:31

标签: android android-fragments android-activity android-sqlite android-database

我将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();

3 个答案:

答案 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();