2015-02-24 70 views
0

我的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:

12月2日至24日:28:26.522 12756-12765/com.itsmr.dre2k14 E /光标:完成尚未停用或关闭的游标。 database = /data/data/com.itsmr.dre2k14/databases/keys.db,table = null,query = SELECT * FROM keys 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) at com.itsmr.dre_android_clean.KeyTable.getKey(KeyTable.java:41) at com.itsmr.dre_android_clean.Login。net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1416) noConnectValidate(Login.java:218) at com.itsmr.dre_android_clean.Logi n.connect(Login.java:97) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at android.view.View $ 1.onClick(View.java:3964) at android.view.View.performClick(View.java:4640) at android.view.View $ PerformClick.run(View.java:19421) at android.os。 Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread。 main(ActivityThread.java:5476) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) at dalvik.system.NativeStart。 main(Native Method)

+0

什么是例外 – Fahim 2015-02-24 17:39:59

+0

包括logcat的为例外 – drulabs 2015-02-24 17:43:28

回答

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

+0

完美,谢谢 – clavio 2015-02-24 18:56:43