关于SQLite,Android上SQLite的最佳实践
2013-05-23 17:29
267 查看
· Sqlite拥有文件级别的锁。许多线程可以同时读,但只有一个可以写。锁阻止多个同时写入。
· Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。
· 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。
没如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。
因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。
但是,会不会有“close() was never explicitly called on database”异常呢?
如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
· Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。
· 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。
没如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。
因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。
但是,会不会有“close() was never explicitly called on database”异常呢?
如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
相关文章推荐
- 关于Android最佳性能实践——分析内存的使用情况学习笔记
- 关于Android最佳性能实践——高性能编码优化学习笔记
- 关于Android最佳性能实践——布局优化技巧学习笔记
- 关于Android最佳性能实践——合理管理内存学习笔记
- 【Android 适配】关于android屏幕适配的最佳实践
- android: SQLite 数据库的最佳实践
- 关于iOS应用设计的一些最佳实践
- Android 开发最佳实践
- 关于shell脚本编程的10个最佳实践
- Android最佳性能实践(三)——高性能编码优化
- AndroidStudio NDK开发最佳入门实践
- Android最佳性能实践(二)——分析内存的使用情况
- Android4开发入门最佳实践
- android开发最佳实践
- (转)Android最佳性能实践(二)——分析内存的使用情况
- Android 开发最佳实践
- [android]一个关于UDP和TCP的项目实践(一)
- Android最佳实践性能(三)提高性能布局(优化布局层次结构)
- Android最佳性能实践(四)——布局优化技巧
- Android中关于SQLite的操作