如何在Android中正确打开/关闭SQLite数据库

The*_*ter 10 database sqlite android

我有一个功能正常的应用程序,不会强制关闭或崩溃.但是当我看LogCat时,它偶尔会给我这个:

05-20 15:24:55.338: E/SQLiteDatabase(12707): close() was never explicitly called on database '/data/data/com.---.--/databases/debt.db' 
05-20 15:24:55.338: E/SQLiteDatabase(12707): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
Run Code Online (Sandbox Code Playgroud)

一点点下来......

05-20 15:24:55.338: E/System(12707): Uncaught exception thrown by finalizer
05-20 15:24:55.338: E/System(12707): java.lang.IllegalStateException: Don't have database lock!
Run Code Online (Sandbox Code Playgroud)

我不确定何时应该打开和关闭我的数据库?

我有一个主要活动,只是一个闪屏.然后它进入一个使用来自DB的信息调用ListView的活动; 所以在这个 DB首次打开的活动中.

还有一个其他活动,其中需要DB与ListVeew分支.什么时候我应该打开和关闭这个?Word似乎是我只需要打开一次,然后在应用程序"暂停","停止"或"销毁"时关闭.

如果是这种情况,我在哪里将db.close()方法放在启动屏幕主要活动中,其中onStop等位于何处?或者与打开数据库的活动相同的活动?或..还有另一个地方吗?

更新:

这是错误指向的代码行:

public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
}
Run Code Online (Sandbox Code Playgroud)

小智 9

如果您正在使用DatabaseHelper类的实例,并且在初始化DBHelper对象之后,每次在数据库中工作时都应该在执行工作之前调用open方法,然后创建新游标,查询数据库,执行处理光标中存储的信息,关闭光标后关闭数据库.例如,如果您想要获取数据库中的每个项目,您可以执行以下操作:

...    
DataBaseHelper db = new DataBaseHelper(this);
... 
db.open();
Cursor cursor = db.getAllItems(); 
maxCount = cursor.getCount(); 
Random gen = new Random();
row = gen.nextInt(maxCount); // Generate random between 0 and max
if (cursor.moveToPosition(row)) {
    String myString = cursor.getString(1);  //here I want the second column
    displayString(myString); //private method
}
cursor.close();
db.close(); 
Run Code Online (Sandbox Code Playgroud)

getAllItems在我DatabaseHelper看来是一个公共方法,如果你想知道它看起来像这样

public Cursor getAllItems() {
    return db.query(DATABASE_TABLE, 
        new String[] {
            KEY_ROWID, 
            KEY_NAME
        }, 
        null, 
        null, 
        null, 
        null, 
        null);
}
Run Code Online (Sandbox Code Playgroud)

这就是我访问我的数据库的方式,我没有得到任何你得到的错误,它完美无缺.