【问题标题】:Application did not close cursor, despite getting closed应用程序未关闭光标,尽管已关闭
【发布时间】:2015-02-24 17:31:26
【问题描述】:

我的 Android 应用程序中有一个 SQLite 数据库。当我执行一项操作时,我总是得到一个尚未停用或关闭的完成光标。方法如下:

public String getKey(){
    net.sqlcipher.database.SQLiteDatabase db = this.getWritableDatabase(Login.authPass);
    String selectQuery = "SELECT  * FROM " + STABLE;
    Cursor cursor = db.rawQuery(selectQuery, null); //This is the line that throws the exception
    String s = cursor.getString(1);
    cursor.close();
    db.close();
    return s;
}

这真的很令人沮丧,因为我要关闭光标,它甚至在它到达之前就抛出了一个异常。我也不明白我在这条线上所做的任何事情是如何被认为是完成光标的。谢谢。

编辑添加Logcat:

02-24 12:28:26.522 12756-12765/com.itsmr.dre2k14 E/Cursor: 完成尚未停用或关闭的光标。数据库 = /data/data/com.itsmr.dre2k14/databases/keys.db,表 = null,查询 = SELECT * FROM 键 net.sqlcipher.database.DatabaseObjectNotClosedException:应用程序没有关闭在此处打开的游标或数据库对象 在 net.sqlcipher.database.SQLiteCursor.(SQLiteCursor.java:217) 在 net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) 在 net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1447) 在 net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1416) 在 com.itsmr.dre_android_clean.KeyTable.getKey(KeyTable.java:41) 在 com.itsmr.dre_android_clean.Login.noConnectValidate(Login.java:218) 在 com.itsmr.dre_android_clean.Login.connect(Login.java:97) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 android.view.View$1.onClick(View.java:3964) 在 android.view.View.performClick(View.java:4640) 在 android.view.View$PerformClick.run(View.java:19421) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5476) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 包含异常的 logcat

标签: android sqlite cursor


【解决方案1】:

看来您应该调用 moveToFirst() 将光标移动到数据库中的第一行。

另外,只要确保这是您想要的,调用cursor.getString(1); 将获得当前行中的第二列,因为它是从零开始的。 http://developer.android.com/reference/android/database/Cursor.html#getString(int)

此外,最佳做法是在使用游标之前确保游标不为空,同时使用 try/catch 进行数据库操作。

public String getKey(){
 String s = null;

 try{
  net.sqlcipher.database.SQLiteDatabase db = this.getWritableDatabase(Login.authPass);
  String selectQuery = "SELECT  * FROM " + STABLE;
  Cursor cursor = db.rawQuery(selectQuery, null);
  if (cursor != null && cursor.moveToFirst()){
    s = cursor.getString(1);
  }

 } catch (Exception ex) {
    Log.e("MyApp", ex.getMessage());
 } finally
 {
    if (cursor != null) {
       cursor.close();

    }
    if (db != null) {
        db.close();
    }

 }

return s;
}

这篇文章也可能有帮助: cursor.getstring() is getting the wrong field in the database

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多