2012-03-14 3 views
1

sqlite 관련 커서에이 오류가 있습니다. 데이터베이스에 액세스하려면 SQLiteOpenHelper의 하위 클래스입니다. 그런 다음 DB에 액세스 한 후 바로 커서를 닫습니다.android 및/sqlite : 커서로 인해 문제가 발생합니다.

코드는 다음과 같습니다 :

String sql = "SELECT * FROM table_bla LIMIT 1"; 
Cursor cursor = dbHelper.getWritableDatabase().rawQuery(sql, null); 

cursor.moveToFirst(); 
String x = cursor.getString(cursor.getColumnIndex("x")); 
cursor.close(); 

그리고이 얻을 :

03-14 15:34:55.945: E/Database(3825): close() was never explicitly called on database '/data/data/my.project/databases/myDB.db' 
03-14 15:34:55.945: E/Database(3825): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
03-14 15:34:55.945: E/Database(3825): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:572) 
03-14 15:34:55.945: E/Database(3825): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
03-14 15:34:55.945: E/Database(3825): at my.project.StartScreen.onResume(StartScreen.java:35) 
03-14 15:34:55.945: E/Database(3825): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
03-14 15:34:55.945: E/Database(3825): at android.app.Activity.performResume(Activity.java:3832) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2231) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2256) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1789) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
03-14 15:34:55.945: E/Database(3825): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-14 15:34:55.945: E/Database(3825): at android.os.Looper.loop(Looper.java:130) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.main(ActivityThread.java:3835) 
03-14 15:34:55.945: E/Database(3825): at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 15:34:55.945: E/Database(3825): at java.lang.reflect.Method.invoke(Method.java:507) 
03-14 15:34:55.945: E/Database(3825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
03-14 15:34:55.945: E/Database(3825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
03-14 15:34:55.945: E/Database(3825): at dalvik.system.NativeStart.main(Native Method) 

사람이 원인이 알고 내가 활동을 닫을 때 그럼에도 불구하고,이 오류가 발생?

+1

데이터베이스 개체를 닫으셨습니까? –

답변

2
그런 코드를 다시 작성

:

String sql = "SELECT * FROM table_bla LIMIT 1"; 
SQLiteDatabase database = dbHelper.getWritableDatabase(); 
Cursor cursor = database.rawQuery(sql, null); 

cursor.moveToFirst(); 
String x = cursor.getString(cursor.getColumnIndex("x")); 
cursor.close(); 
database.close(); 

그렇지 않으면 당신은 문제가 발생하면 결코 가까이 데이터베이스에 대한 연결을 얻을.

+0

또한 그는 DB에 수정을 가하지 않기 때문에 쓰기 가능한 데이터베이스 대신 읽을 수있는 데이터베이스를 가져야합니다. – dymmeh

+0

은 정말로 중요하지 않습니다.'getReadableDatabase()'는 가능한 경우 쓰기 가능하게합니다. 편집 : 잘 그것은 DB를 얻기 위해 열심히 시도 이후 읽을 수있는 DB를 요청하는 것이 안전합니다. – zapl

2

이것은 앱을 종료하기 전에 DB에 대한 액세스를 닫아야하기 때문입니다.이 코드가 강제로 닫히지 않는다고 생각합니다.

관련 문제