Android sqlite 操作最佳实践及其注意事项
2014-05-28 16:39
441 查看
1、同一个Helper每次调用getWriteableDataBase实质上是返回的同一个DataBase,若在多次调用getWriteXXXX 不会报错,而是直接返回了之前已经打开的database,如果检测到DataBase已经被关闭了,则新打开一个DataBase并返回。
2、要支持多个线程同时去操作数据库,必须要用到同一个连接。
例如有2个helper都会去getDataBase,他们得到的连接是2个不同的对象。
// Thread 1
SQLiteDatabase database = getWriteDatabaseXXX()
database.insert(…); // CRUD操作
database.close();//关闭
// Thread 2
SQLiteDatabase database = getWriteDatabaseXXX()
database.delete(…); // CRUD操作
database.close();//关闭
结果: 某个线程会操作失败,并报异常:android.database.sqlite.SQLiteDatabaseLockedException: database is locked
原因: 是我们使用了不同的数据库连接。
3、在异步的环境下,用同一个连接也会产生问题, 比如2个线程都在去操作数据库。
SQLiteDatabase
singelDataBase ; // 唯一的
// Thread 1
SQLiteDatabase database = singelDataBase ;
database.insert(…); // CRUD操作
database.close();//关闭
// Thread 2
SQLiteDatabase database = singelDataBase ;
database.delete(…); // CRUD操作
database.close();//关闭
第一个线程执行完毕后,就会关掉连接,第二个再去执行的时候,就会报 attempt to re-open an already-closed object: SQLiteDatabas,
解决办法:
1、一直不关闭这个连接,直到App destory的时候,才去关闭连接。但是这样会 Caused by: java.lang.IllegalStateException:
SQLiteDa tabase created and never closed 一直会出现此警告,肯定不值得推荐。同时如果该Helper一直没关闭连接(DataBase),当垃圾回收的时候,会报
Close() was never explicitly called on databse 错误。以下是垃圾回收代码截图
2、需要手动程序控制,当没有其他操作在使用这个连接的时候,才真正的去关闭该连接,利用(AtomicInteger)
2、要支持多个线程同时去操作数据库,必须要用到同一个连接。
例如有2个helper都会去getDataBase,他们得到的连接是2个不同的对象。
// Thread 1
SQLiteDatabase database = getWriteDatabaseXXX()
database.insert(…); // CRUD操作
database.close();//关闭
// Thread 2
SQLiteDatabase database = getWriteDatabaseXXX()
database.delete(…); // CRUD操作
database.close();//关闭
结果: 某个线程会操作失败,并报异常:android.database.sqlite.SQLiteDatabaseLockedException: database is locked
原因: 是我们使用了不同的数据库连接。
3、在异步的环境下,用同一个连接也会产生问题, 比如2个线程都在去操作数据库。
SQLiteDatabase
singelDataBase ; // 唯一的
// Thread 1
SQLiteDatabase database = singelDataBase ;
database.insert(…); // CRUD操作
database.close();//关闭
// Thread 2
SQLiteDatabase database = singelDataBase ;
database.delete(…); // CRUD操作
database.close();//关闭
第一个线程执行完毕后,就会关掉连接,第二个再去执行的时候,就会报 attempt to re-open an already-closed object: SQLiteDatabas,
解决办法:
1、一直不关闭这个连接,直到App destory的时候,才去关闭连接。但是这样会 Caused by: java.lang.IllegalStateException:
SQLiteDa tabase created and never closed 一直会出现此警告,肯定不值得推荐。同时如果该Helper一直没关闭连接(DataBase),当垃圾回收的时候,会报
Close() was never explicitly called on databse 错误。以下是垃圾回收代码截图
2、需要手动程序控制,当没有其他操作在使用这个连接的时候,才真正的去关闭该连接,利用(AtomicInteger)
相关文章推荐
- MySQL 磁盘复制技术--DRBD:优缺点比较、注意事项以及最佳实践
- Scala深入浅出进阶经典 第65讲:Scala中隐式转换内幕操作规则揭秘、最佳实践及其在Spark中的应用源码解析
- 复制最佳实践MySQL 磁盘复制技术--DRBD:优缺点比较、注意事项以及最佳实践
- Graphite的Dashboard绘制的注意事项和最佳实践
- java字符流操作flush()方法及其注意事项
- 14个非常有用的jquery技巧,注意事项和最佳实践
- MySQL磁盘复制技术--DRBD:优缺点比较、注意事项以及最佳实践
- Scala中隐式转换内幕操作规则揭秘、最佳实践及其在Spark中的应用源码解析之Scala学习笔记-55
- Spark 实践 - RDD 的 join操作之需要注意的事项 - RDD为空的join操作
- 65.Scala中隐式转换内幕操作规则揭秘、最佳实践及其在Spark中的应用源码解析
- Node.js与MySQL交互操作及其注意事项
- 异地备份的最佳实践与注意事项
- Canal & Otter 的一些注意事项和最佳实践
- 《Visual C# 最佳实践》第四章 函数 (四):使用函数注意事项
- Cisco 基本操作注意事项、学习要点及其总结
- 【JavaEE】javaEE学习笔记之分页实践操作笔记重点和注意事项
- 在img里的onload事件 使图片按比例缩放 及其注意事项
- RHEL 4/5 DVD光盘的制作及其注意事项
- VC++的MFC程序中操作数据库注意事项
- string浅拷贝及其在dll中运用的注意事项