技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 移动开发 > android > 正文

关于让人头疼的数据库异常问题

来源: 技术CTO 阅读:

错误日志在这里

06-20 09:45:11.291: E/StrictMode(7682): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.example.aaa/databases/Library, table = List, query = SELECT * FROM List WHERE RANDOM_STRING = ?
06-20 09:45:11.291: E/StrictMode(7682): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:98)
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:50)
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1334)
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1176)
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1047)
06-20 09:45:11.291: E/StrictMode(7682):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1215)
06-20 09:45:11.291: E/StrictMode(7682):  at com.example.aaa.ceshi.SQLiteHelper.queryRandomString(SQLiteHelper.java:167)
06-20 09:45:11.291: E/StrictMode(7682):  at com.example.aaa.ArchivesActivity.onActivityResult(ArchivesActivity.java:365)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.Activity.dispatchActivityResult(Activity.java:5514)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3548)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3595)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.ActivityThread.access$1600(ActivityThread.java:141)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
06-20 09:45:11.291: E/StrictMode(7682):  at android.os.Handler.dispatchMessage(Handler.java:102)
06-20 09:45:11.291: E/StrictMode(7682):  at android.os.Looper.loop(Looper.java:136)
06-20 09:45:11.291: E/StrictMode(7682):  at android.app.ActivityThread.main(ActivityThread.java:5336)
06-20 09:45:11.291: E/StrictMode(7682):  at java.lang.reflect.Method.invokeNative(Native Method)
06-20 09:45:11.291: E/StrictMode(7682):  at java.lang.reflect.Method.invoke(Method.java:515)
06-20 09:45:11.291: E/StrictMode(7682):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
06-20 09:45:11.291: E/StrictMode(7682):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
06-20 09:45:11.291: E/StrictMode(7682):  at dalvik.system.NativeStart.main(Native Method)

查询方法在这
     //根据条件查询
     public Cursor queryRandomString(String tableName,String randomString){
      SQLiteDatabase db = this.getReadableDatabase();
      Cursor cursor = db.query(tableName, null, "RANDOM_STRING" + " = ?",
      new String[]{randomString}, null, null, null);
      return cursor;
     }

请大神看一看到底是什么原因,头大呀。这个异常是不稳定异常,有时候正常有时候会崩就出这个异常。

还需要什么代码回复我 ,我贴上
创建table表的代码

我感觉你这句话不对
Cursor cursor = db.query(tableName, null, "RANDOM_STRING" + " = ?",
      new String[]{randomString}, null, null, null);

应该去掉"RANDOM_STRING"的引号,应该改为
Cursor cursor = db.query(tableName, null, RANDOM_STRING + " = ?",
      new String[]{randomString}, null, null, null);
Finalizing a Cursor that has not been deactivated or closed. 
你的游标没关闭。
cursor用完就一定要关闭
cursor.close();
db.close();
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

提示游标或数据库对象已经打开过了,没有关闭。

android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:98)
这一行是要打开一个游标,因此综合来看,应该是你的游标使用后没有关闭。
我数据库关了,db没关,偶尔程序会蹦,错误信息如下,我不知道这是怎么产生的
06-20 17:05:08.543: E/StrictMode(7713): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
06-20 17:05:08.543: E/StrictMode(7713): java.lang.Throwable: Explicit termination method 'close' not called
06-20 17:05:08.543: E/StrictMode(7713):  at dalvik.system.CloseGuard.open(CloseGuard.java:184)
06-20 17:05:08.543: E/StrictMode(7713):  at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:805)
06-20 17:05:08.543: E/StrictMode(7713):  at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
06-20 17:05:08.543: E/StrictMode(7713):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:986)
06-20 17:05:08.543: E/StrictMode(7713):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:256)
06-20 17:05:08.543: E/StrictMode(7713):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
06-20 17:05:08.543: E/StrictMode(7713):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
06-20 17:05:08.543: E/StrictMode(7713):  at com.example.aaa.ceshi.SQLiteHelper.queryRandomString(SQLiteHelper.java:170)
06-20 17:05:08.543: E/StrictMode(7713):  at com.example.aaa.ArchivesActivity.initView(ArchivesActivity.java:194)
06-20 17:05:08.543: E/StrictMode(7713):  at com.example.aaa.ArchivesActivity.onCreate(ArchivesActivity.java:77)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.Activity.performCreate(Activity.java:5248)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ActivityThread.access$800(ActivityThread.java:138)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
06-20 17:05:08.543: E/StrictMode(7713):  at android.os.Handler.dispatchMessage(Handler.java:102)
06-20 17:05:08.543: E/StrictMode(7713):  at android.os.Looper.loop(Looper.java:136)
06-20 17:05:08.543: E/StrictMode(7713):  at android.app.ActivityThread.main(ActivityThread.java:5016)
06-20 17:05:08.543: E/StrictMode(7713):  at java.lang.reflect.Method.invokeNative(Native Method)
06-20 17:05:08.543: E/StrictMode(7713):  at java.lang.reflect.Method.invoke(Method.java:515)
06-20 17:05:08.543: E/StrictMode(7713):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
06-20 17:05:08.543: E/StrictMode(7713):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
06-20 17:05:08.543: E/StrictMode(7713):  at dalvik.system.NativeStart.main(Native Method)

代码在这里,cursor = helper.queryRandomString(TABLE_NAME2, randPath);这一行出错,每次出错都是这一行
Cursor cursor = null;
try {
cursor = helper.queryRandomString(TABLE_NAME2, randPath);

List<Map<String, String>> data2 = new ArrayList<Map<String, String>>();
while (cursor.moveToNext()) {
Map<String, String> map = new HashMap<String, String>();
map.put("XIAO_XI", cursor.getString(1));// 上报时间
map.put("REPORT_PERSON", cursor.getString(2));// 距离
map.put("TIME", cursor.getString(3));// 爆漏地址
map.put("RANDOM_STRING", cursor.getString(4));// 接报时间
map.put("RANDOM_PATH2", cursor.getString(5));// 现场负责人

data2.add(map);
}
// if (cursor.moveToNext()) {
// randString = cursor.getString(4);
// String ss = cursor.getString(5);
// }
cursor.close();
adapter = new ArchivesAdapter(this, data2);
listView.setAdapter(adapter);

} catch (Exception e) {

} finally {
}

数据库查询方法在这里
   //根据条件查询
     public Cursor queryRandomString(String tableName,String randomString){
      Cursor cursor = null;
      SQLiteDatabase db =null;
      if(db == null || !db.isOpen()){
  db = this.getReadableDatabase();
  db = this.getWritableDatabase();
  }
      cursor = db.query(tableName, null, "RANDOM_STRING" + " = ?",
      new String[]{randomString}, null, null, null);
      return cursor;
     }
就怕这种偶尔出错的问题,都不知从何下手,debug代码从来不崩,不debug有时候会蹦,崩溃啊
     Cursor cursor = null;
      SQLiteDatabase db =null;
      if(db == null || !db.isOpen()){
  db = this.getReadableDatabase();
  db = this.getWritableDatabase();

这几句话写的很有问题啊,你都db=null,下一句还判断db==null || !db.isOpen()多此一举,db使用了2次赋值。直接这样写就行了:
     Cursor cursor = null;
      SQLiteDatabase db =null;
  db = this.getWritableDatabase();

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^