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

Android 每次操作数据时是否需要调用getWritableDatabase(),android,sqlite,Android,Sqlite,我有一个关于android中sqlite数据库的新手问题: 我真的需要在每次操作数据时检索可写数据库吗 我能写一把这样的刀吗 class Dao { private final SQLiteDatabase database; public Dao(SQLiteOpenHelper databaseHelper){ database = databaseHelper.getWritableDatabase(); }

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

我真的需要在每次操作数据时检索可写数据库吗

我能写一把这样的刀吗

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(....);
    }
}
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(....);
    }
}
或者我必须这样写我的刀:

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(....);
    }
}
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(....);
    }
}
如果第二种方法是正确的: 每次操作后是否还需要关闭数据库:

public void update(...){
    SQLiteDatabase database = databaseHelper.getWritableDatabase();
    ContentValues cv = new ContentValues(4);
    database.update(....);
    database.close();
}

我想这与databaseHelper.getReadableDatabase()相同,对吗?

您应该关闭打开的每个光标。但每次使用后,不需要关闭数据库实例

我通常在
onCreate()
中获取一个可写数据库,并将生成的
SQLiteDatabase
存储为每个活动的成员变量,并且从不显式关闭该实例。(不过,我会在处理完每个光标的结果后立即关闭它们。)


有关此主题的更多讨论,请参阅。

我不想在每项活动中都这样做。因此,我将对应用程序进行子类化,并在那里实现类似于单例的东西,以确保Dao(更具体的是SQLiteOpenHelper)只被实例化once@sockeqwe:您可以将其作为静态文件放在应用程序中,但这通常被认为是不好的做法。这也将使测试活动更加困难。但是,如果你不关心良好的实践或正式的代码测试,那么是的,这是可行的。只需确保您的任何代码都不会关闭连接;否则,某些活动无法间歇性地获得连接的原因就不明显了。(这也是这种做法不好的原因之一。)