Android 上的 SQL Lite 性能

虫虫 发布于 2012/04/08 14:10
阅读 5K+
收藏 20

也许有人还不知道,Android 是有一些内建的 类库支持 SQL Lite 数据库的操作。他提供了一个很好的方式在 Android 上组织少量的数据。不管怎样,在使用这些类库的时候有一些陷阱是需要注意的。


根据你所使用的版本不同,一个相同的查询的运行时间可能从几毫秒到几分钟不等。例如,一个查询可能在 Galaxy S2 运行少于一秒(在 iPhone 4 上可能更快),但是在 Atrix 2 和 HTC Desire 上运行却需要一分钟。所有这些手机都有类似的硬件,那么区别在哪里?

在对代码研究了几天后,我发现问题在于查询语句的设计。当你使用大量的 joins 或者 unions 的时候,问题就出现了。组合一张大的数据表和一张或多张中等大小的数据表,需要非常小心的优化来保证在所有的设备上都有良好的性能。在做 unions 或者 joins 之前限制数据表的大小很重要!

我们以下面的数据库和数据表为例:
· 一张 Person 表,有 name, height, age 等字段
· 一张 Family 表,包含了家庭的详情
· 一张 City 表,包含了所有城市的信息

在 Android 上面把所有这些表联合起来(假设 Person 表有超过2000条记录)在大部分设备上是没有问题的。但是假如你的用户正在使用一个老版本的 SQL Lite 版本,你的应用就慢的无法使用了。你要尽量让 join 的记录越少越好以保证性能。例如,你从 Person 表中抽取一部分记录再做 join,性能就会好很多。

这里的难点是如何知道用户使用的是什么版本的 SQL Lite。虽然 Android 有一个默认的版本,但是似乎不同的厂商在不同的设备上用了不同的 SQL Lite 版本。这就给我们造成了很大的麻烦。

StackOverFlow 上有一些关于这方面的信息。总之尝试去获得设备的 SQL Lite 版本是很困难的,你最好还是把力气花在优化 SQL 上面,以保证在所有的设备上都有良好的性能。

还有一个有趣的地方就是 Android 上面,一条查询究竟是何时被执行的。也许你认为当你获得 Cursor 对象的时候,查询就执行完了。但事实情况是,查询不会被执行直到 Cursor 被第一次访问,例如 moveToNext,moveToFirst 操作。所以请不要在 UI 线程或者相关的线程中使用 cursor,否则界面会卡死。

原文链接OSChina.NET 编译

加载中
0
紫外线
紫外线
没用过android阿,落伍阿
0
jeffsui
jeffsui
额,一句话android上的SQLite性能很低下,只能靠写强大的sql语句来优化。
0
费斯特
费斯特
自己带一个sqlite库然后在sd卡里读写?
0
gzgang
gzgang
期待h2与android完美对接
ExtremeTalk
ExtremeTalk
+1
0
ufo.22940268
ufo.22940268

linux下sqlite ide求推荐,linux下一直找不到一款满意的,导致现在就用命令行下的sqlite3进行查看    

ufo.22940268
ufo.22940268
回复 @开曼群岛真好 : 不好意思,我表达能力比较差。 大概意思就是adb shell进入机子的terminal,然后再在里面查看数据库。这样子就能看到数据库实时的变化了。 如果是adb pull到本地,那么数据变化过之后,本地的不会更新。但是貌似哪些数据库ide(我也不知道怎么形容)都只能打开本地的数据库文件。
骆昱
骆昱
回复 @ufo.22940268 : "在真机上查看"? 还是查看真机上的数据库? 还有, SQLite3的数据库也就是个文件吧, 即使是用命令行, 不也是指向该文件然后打开数据库么?~ (如果是查看真机上的数据库的话)
ufo.22940268
ufo.22940268
@开曼群岛真好 怎么说呢,我需要在真机上查看数据库。navicate应该不能远程查看真机上的数据库吧?
骆昱
骆昱
Navicat有Linux版的吧~
0
Reiz
Reiz
弱弱地问一句,你的意思是不要在Activity的生命周期中调用Cursor,还是怎么?
姚远
姚远
尽量不要在UI线程操作Cursor! 记得用过后一定要释放掉
0
zixiaolianxue
zixiaolianxue

使用已经存在的数据库,打开的时候报:android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed

是什么原因哈

zixiaolianxue
zixiaolianxue
恩,使用一个已经存在的数据库文件,直接打开这个文件,不再建库,建表,直接打开已有的会报错
返回顶部
顶部