在Android中为Sqlite数据库使用Singleton模式

时间:2016-04-07 04:06:20

标签: java android sqlite singleton

我有点困惑如何正确地做到这一点。这是我的DatabaseHelper类:

public class DatabaseHelper extends SQLiteOpenHelper {
    private static DatabaseHelper mInstance = null;

    private static final String DB_NAME = "database.db";
    private static final int DB_VERSION = 1; 

    private Context mContext;

    public static DatabaseHelper getInstance(Context context) {

        if (mInstance == null) {
            mInstance = new DatabaseHelper(context.getApplicationContext());
        }
        return mInstance;
    }

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        mContext = context;
    }

  ...

假设这是正确的,这是处理查询类的正确方法:

public class DatabaseProcessor {

    private SQLiteDatabase mDatabase;
    private DatabaseHelper mSQLHelper;
    private Context mContext;

    public DatabaseProcessor(Context context) {
        mContext = context;
        mSQLHelper = new DatabaseHelper(mContext);
    }

    private void open() throws SQLException {
        mDatabase = mSQLHelper.getWritableDatabase();
    }

    private void close() {
        mDatabase.close();
    }

    public void insertSomethingIntoDb(String key) {
        ContentValues values = new ContentValues();
        values.put("some_column_name", name);
        open();
        mDatabase.insert("some_table_name", null, values);
        close();
    }
...

如果这是正确的,我如何在任何地方从代码中的其他位置(如Activity,Fragment等)正确调用db方法。

1 个答案:

答案 0 :(得分:2)

您应该使用DatabaseHelper构造函数private并使用getInstance方法创建此类的实例。例如:mSQLHelper = DatamabseHelper.getInstance(context)

要调用此类的方法,您可以执行以下操作。

DatabaseHelper.getInstance(context).someFunction(...);

要使用任何DatabaseProcessor函数,您可以执行以下操作:

new DatabaseProcessor(context).insertSomethingIntoDb(...);

请记住,这个单例方法有一些问题,对于初学者来说,它不支持多线程,没有机制来确保如果两个线程同时请求一个实例,只有一个实例将是创建