安卓本地的数据库sqlite对于咱们数据本地存储有很大的帮助,但是使用不当,也会出现慢卡的现象,下面由我分享几点我自己碰到的几个问题并给出相应的方案和思路!
问题1:数据库泄露
A SQLiteConnection object for database '/storage/sdcard0/testdemo.db' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
这个就是数据库打开以后,由于某种原因没有关上,但打开的界面又被销毁了,系统发现就会提示,数据库泄露了:
解决办法:对于查询的Cursor指针,使用完了在最后关闭如下:
Cursor cursor=null;
try{
cursor= db.rawQuery(queryStr, new String[] { id});
//做你想做的操作
}catch(Exceptione){
}finally{
if(null!=cursor){
cursor.close();
}
}
对Database对象,最好在Activity或者Fragment结束时关闭它(此为单个为例)如下:
@Override
publicvoid onDestroy() {//private SQLiteDatabase db=null;
super.onDestroy();
if(null!=db){
db.close();
}
}
问题2:对于一条一条插入数据进数据库如果量大时,数据库就会很慢,很耗时。
我试了一下,大概500块数据,一条一条插入到数据库,大概就4秒以上,对于程序来讲太慢了,也接受不了!那怎么办呢?我们得使用一个事务的方式,就是数据库事务开始,然后开始大量的插入数据,最后把这么多操作当作一个事务,提交上去,这样就很快了!例子代码如下:
publicvoid insertPersonList(SQLiteDatabase db, List<PersonInfos> aList) {
if(null==db|| false==db.isOpen() || null==aList || aList.isEmpty())return;
db.beginTransaction();
try{
for(PersonInfosaPerson:aList){
StringwhereContent =" id= ? ";
db.delete(PERSON _TABLE,whereContent, new String[] {aPerson.getId()});
ContentValuesvalues=getPersonContentValues(aPerson);
db.insert(PERSON_TABLE,null, values);
}
db.setTransactionSuccessful();
}catch(Exceptione){
e.printStackTrace();
}finally{
db.endTransaction();
}
}
问题3:当在一个大列表中需要使用到中英文排序甚至分类,每次使用都需要中文转英文加上排序算法都很复杂和耗时!
这时就可以使用sqlite数据库解决这个问题,先从网络下载数据,然后把中文转成英语,当作一个数据保存下来,然后在以后的使用中查询一下就好了!如下:
select * from PERSON_TABLE where ... OrderBy SORT_LETTERS;
好了,关于数据库遇到的问题,我暂时想到这么多,以后碰到再更新吧,如果有那位兄弟知道的更多,麻烦告诉下,在这里先谢谢了!