日期:2014-05-16  浏览次数:20398 次

android数据库操作优化(一)

        这是我今年陆陆续续写的有关android上数据库操作的文章,以前都发布在开发论坛上,现在把整理到这里。

        1.由于SQLiteDatabase对象较为耗费资源,所以我们在使用完SQLiteDatabase对象之后,必须立即关闭它,避免它继续占用资源,否则我们继续程序可能会导致OOM或者其他异常;

        2.同理,我们在使用完cursor之后也应该立即关闭cursor,避免资源浪费;

        3.我们在关闭数据库之前,必须将取得的数据保存到Map或者List中,否则关闭数据库之后,数据也会随之消失;

        4.使用明确的查询语句,在数据库的查询中避免使用select * from table这样的语句,我们一般不会用到全部的数据,但这样查询不仅浪费时间,也浪费android有限的内存,所以我们必须明确查询目标,例如:select id,name from people;

        5.在较为频繁的数据库操作中(例如批量插入数据),可以使用数据库事物来处理频繁操作(如果只有一个数据操作,则android默认使用事物);

        6.在sqlite数据库中使用索引,给经常查询的列创建索引,但索引不适用于较大的数据库,较大的数据库创建索引会耗费太多的时间,而且每次改动一条数据,整个索引都将重新创建;

        7.如果需要在pc上制作数据库db文件,推荐使用Navicat Premium,功能强大,但是费用也很强大,不过可以免费试用;

        8.制作本地数据库db文件的时候,需要使用UTF-8编码(很多pc端sqlite3工具不支持utf-8编码或者保持和系统编码一致),否者在取数据的时候会出现乱码,另外,根据我们使用的pc数据库文件不同,我们可能会生成不同的sqlite3数据库的后缀文件,例如.s3db文件,这个其实没有影响,android数据库会识别它的,如果你感觉别扭,可以手动改为.db就可以了,这也是没关系的;

        9.制作本地数据库还有一点比较重要的就是默认主键必须为“_id”并设置为自动增长,不可以是其他的,而且每个表都必须有,如果你的数据库没有这个主键,在你的app运行中会报错,日志提示缺少“_id”字段,至于为什么应用内创建数据库不会产生这样的问题,那是因为android系统默认在创建数据库的时候就是为“_id”为主键的,即使你没有写这样的创建语句;

        10.还有好多人不知道怎么将mysql或者execl中的数据导入到sqlite3数据库中,这里我提供一个思路,可以将execl另存为csv文件,大部分数据库也可以直接到处csv格式的文件,然后我们用记事本打开csv文件就会发现里面就是inert into table values();可以直接放入values的部分,可以用java程序写一个批量插入语句即可制作sqlite3 db数据库文件;

        11.制作好的sqlite3 db数据库文件应该放在项目的assets文件夹或者res/raw文件夹中,然后在app启动的过程中将数据库用java io流复制到data/data/packagename/database目录中(注意,如果你的db数据库文件较大,请放在内存卡或者其他外存中);