每次操作数据时是否需要调用getWritableDatabase()

soc*_*qwe 7 sqlite android

我有一个关于android中的sqlite数据库的新手问题:

每次操作数据时,我是否真的需要检索可写数据库?

那么我可以像这样写一个DAO:

class Dao {

        private final SQLiteDatabase database;

        public Dao(SQLiteOpenHelper databaseHelper){

             database = databaseHelper.getWritableDatabase();
    }

    public void insert(...){

       ContentValues cv = new ContentValues(4);
       database.insertOrThrow(TABLE, null, cv);
       ...
    }


    public void update(...){
        ContentValues cv = new ContentValues(4);
        database.update(....);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我必须像这样写我的道:

class Dao {

        private final SQLiteOpenHelper databaseHelper;

        public Dao(SQLiteOpenHelper databaseHelper){

             this.databaseHelper = databaseHelper
    }

    public void insert(...){

       SQLiteDatabase database = databaseHelper.getWritableDatabase();
       ContentValues cv = new ContentValues(4);
       database.insertOrThrow(TABLE, null, cv);
       ...
    }


    public void update(...){
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        ContentValues cv = new ContentValues(4);
        database.update(....);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果第二种方法是正确的:我还需要在每次操作后关闭数据库:

public void update(...){
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    ContentValues cv = new ContentValues(4);
    database.update(....);
    database.close();
}
Run Code Online (Sandbox Code Playgroud)

我觉得它是一样的databaseHelper.getReadableDatabase()吗?

Jon*_*ams 9

你应该关闭你打开的每个光标.但是每次使用后都不需要关闭数据库实例.

我通常会获取一个可写数据库onCreate()并将结果存储SQLiteDatabase为每个活动的成员变量,并且永远不会显式关闭该实例.(但是,一旦我完成处理结果,我会关闭每个光标.)

有关此主题的更多讨论,请参阅在Android中管理SQLite连接.

  • 我不想在每个活动中都这样做。所以我会将应用程序子类化并在那里实现类似单例的东西,以确保 Dao(更具体地说是 SQLiteOpenHelper)仅被实例化一次 (2认同)