前些时候看到兴趣小组里有人问“Android上SQLite的最佳实践”是什么,好奇地搜了一下,确实没有一个好一点的指导文档,平时的使用也只是简单的拷贝code,并没有深入的研究过。以下是我看到的Kevin关于其使用的心得,原文的大体的意思是:
Android例子涵盖了一些Sqlite的基本用法,但它们并没有深入地给出合理的使用方法,更重要的是,不合理的使用方法。大多数例子和文档只是涉及最基本的数据库查询,或者教你如何创建一个ContentProvider。从来不提及的地方像:
· 什么地方创建和保存SQLiteOpenHelper实例?
· 可以有多少个实例?
· 多线程同时访问数据库有没有什么要担心的?
基本的内容是,你可以任意次数地连接Sqlite数据库,而且Android系统也支持你这样做。Sqlite拥有文件级别的锁,用来同步访问和防止错误。如果你只知道这些,那么,将会给你带来很大的痛苦。开源的一个好处是,你可以深入代码一探究竟。从代码和一些测试中,我了解到以下事实:
· Sqlite拥有文件级别的锁。许多线程可以同时读,但只有一个可以写。锁阻止多个同时写入。
· Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。
· 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。
没提到的是,如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。
SQLiteOpenHelper类做了一些有趣的事。尽管它有方法可以获得一个只读的连接和可读写的连接,但实质上它们是同一个连接。假设没有文件写错误的话,只读的连接实质上就是一个可读写的连接。有趣吧。因此,如果你的app中使用一个helper的话,即便从多线程中使用,你也从未使用多个连接。
同样,一个helper中只有一个SQLiteDatabase的实例,这个实例中实现了一些java锁。因此,当你正在执行数据库的操作时,其它db的操作都将锁定。即便是你使用多个线程来做这些事以便优化数据库的性能,坏消息,没有什么用。
按照我的认识,SQLite工作的方式,基本上不可能会破坏你的数据库,除非代码里有bug或者有硬件问题。
因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。
但是,会不会有“close() was never explicitly called on database”异常呢?
如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接。
像这样来使用:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private static DatabaseHelper instance;
public static synchronized DatabaseHelper getHelper(Context context)
{
if (instance == null)
instance = new DatabaseHelper(context);
return instance;
}
//Other stuff...
}
分享到:
相关推荐
uniAPP使用sqlite数据库demo
实验十 使用SQLite数据库存储数据
该文件是在nwjs0.14.7版本使用sqlite时需要编译生成的文件,编译教程很少,也很多坑放到这里给需要的人使用。
Android使用SQLite数据库进行增删改查详细案例...
Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。可是,由于 JDBC 不适合手机这种内存受限设备,所以 Android 开发人员...
VS2010使用SQLite数据库,进行数据库的创建,建表,插入数据,查询数据等;
Unity3d使用sqlite例子,下载后可直接使用,还有封装类
Android中使用SQLite示例,详情可以参见博客:http://www.cnblogs.com/plokmju/p/android_SQLite.html
简单的例子,轻松教会您使用SQLite.这个程序主要做了跟数据库连接、执行一些命令的功能,比如向数据库中插入数据。
Qt 调用SQLITE3数据路,亲测有效
这是Android开发的一个例子,作为学习SQLite的一个样板。使用Android SQLite数据库实现联系人的增删改查功能,同时使用了ListView、Adapter来实现数据的列表显示,使用SearchView与Filter数据过滤器来实现搜索功能。
VB.NET 中使用 SQLite3 的演示代码
增加描述:需要下载SQLite的工具包,已经重新上传。 LabVIEW使用SQLite数据库范例,试运行了建表,插入两个操作,使用SQL语句执行的。
Delphi使用SQLite3,包括本地数据库和内存数据库,本地数据库加载到内存,内存数据库备份到本地,使用sqlite simple delphi包装类。
Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。可以,由于 JDBC 不适合手机这种内存受限设备,所以 Android 开发人员...
使用SQLite本地数据库以及有关如何使用的简介。
在其它程序中使用sqlite时,需要SQLite的引擎文件sqlite3.dll 在.Net中使用SQLite,还需要一个针对SQLite的ADO.NET Provider,即需要sqlite.net.dll 一切准备就绪后,开始,编译运行,出现问题了,报一个什么...
PouchDB使用SQLite实例,实例项目使用的是ionic+angularjs写的demo,用PouchDB使用本地SQLite的使用方法
在swift 上使用sqlite 进行数据库操作 参考 https://github.com/stephencelis/SQLite.swift
java创建使用SQLite数据库的代码示例,以及一个SQLiteDeveloper查看器工具软件 呵呵一套的哦,对于想要学习SQLite数据库的程序员而言是非常绝对超值!