您的位置:首页 > 其它

close() was never explicitly called on database 和 database is locked 错误原因

2014-04-08 15:05 513 查看
1.cursor 使用完没有关闭。

2.数据库用完没有关闭。

3.数据库重复新建(new了多个对象)。

我的错误是new了多个对象。

LogCat 报错信息:

[java] view
plaincopy

02-13 11:58:13.759: ERROR/Database(432): close() was never explicitly called on database '/data/data/com.yyt.ui/databases/yyt.db'

02-13 11:58:13.759: ERROR/Database(432): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

02-13 11:58:13.759: ERROR/Database(432): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1847)

02-13 11:58:13.759: ERROR/Database(432): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)

02-13 11:58:13.759: ERROR/Database(432): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)

02-13 11:58:13.759: ERROR/Database(432): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)

02-13 11:58:13.759: ERROR/Database(432): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)

02-13 11:58:13.759: ERROR/Database(432): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

02-13 11:58:13.759: ERROR/Database(432): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)

02-13 11:58:13.759: ERROR/Database(432): at com.taobao.htc.db.RecordDBHelper.query(RecordDBHelper.java:49)

02-13 11:58:13.759: ERROR/Database(432): at com.taobao.htc.manage.RecordDBopt.get(RecordDBopt.java:78)

02-13 11:58:13.759: ERROR/Database(432): at com.taobao.htc.manage.RecordMessage.sendMseeage(RecordMessage.java:111)

02-13 11:58:13.759: ERROR/Database(432): at com.taobao.htc.manage.RecordMessage.sendMseeage(RecordMessage.java:87)

02-13 11:58:13.759: ERROR/Database(432): at com.taobao.htc.Report.run(Report.java:49)

02-13 11:58:13.759: ERROR/Database(432): at java.lang.Thread.run(Thread.java:1019)

02-13 11:58:13.830: WARN/ActivityManager(62): Launch timeout has expired, giving up wake lock!

02-13 11:58:14.381: DEBUG/dalvikvm(432): GC_CONCURRENT freed 771K, 57% free 2908K/6727K, external 2013K/2137K, paused 7ms+5ms

02-13 11:58:14.630: DEBUG/dalvikvm(432): GC_FOR_MALLOC freed 867K, 58% free 2836K/6727K, external 2013K/2137K, paused 178ms

发生错误原因分析:

主要错误:

[java] view
plaincopy

02-13 11:58:13.759: ERROR/Database(432): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

出错处代码

[java] view
plaincopy

SQLiteDatabase db = getWritableDatabase();



意思是指在此处打开数据库操作之前,应用程序没有关闭游标或数据库对象。

在应用中,对数据库操作完成后,应该对游标及数据库进行关闭操作

[html] view
plaincopy

if (!cur.isClosed()) {

cur.close();

}

db.close();

解决办法:

检查操作数据库的相关源代码,增加关闭“cursor or database object”的代码 。

总结一下Activity.startManagingCursor方法:

c=cr.query(Uri.parse(Values.contentA + Values.contentB), null, Values.table_02_name+"="+"\""+str+"\";",

null, null);

startManagingCursor(c);

c.moveToFirst();

如果操作cursor不是在Activity中,不能用startManagingCursor函数的



1.这个方法使用的前提是:游标结果集里有很多的数据记录。

所以,在使用之前,先对Cursor是否为null进行判断,如果Cursor != null,再使用此方法



2.如果使用这个方法,最后也要用stopManagingCursor()来把它停止掉,以免出现错误。



3.使用这个方法的目的是把获取的Cursor对象交给Activity管理,这样Cursor的生命周期便能和Activity自动同步,

省去自己手动管理。

——————————————————————————————————我是分割线————————————————————————————————————

而当我们遇到Caused by: android.database.sqlite.SQLiteException: database is locked这个问题时,主要原因大部分都是多线程多数据库进行操作了。这个时候你需要在需要操作数据数据的时候,提供一个统一的入口,并加上同步锁,

我们需要将提供数据库访问的方法设置成同步的,防止异步调用时出现问题,如:

public static synchronized DBConnection getConnection(String connectionName)
   throws Exception {
  String pathFile = getPath() + connectionName;// 转换目录data下
  return new DBConnection(SQLiteDatabase.openDatabase(pathFile, null,
    SQLiteDatabase.OPEN_READWRITE));
 }

使用synchronized 关键字来修饰获取数据库连接的方法,或者使用isDbLockedByOtherThreads方法判断数据库是否被锁住了,然后等待一定的时间再进行访问。

或者使用isDbLockedByOtherThreads方法判断数据库是否被锁住了,然后等待一定的时间,并且对于数据库的操作要及时释放,以免多个线程形成死锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐