今天接收别人的一个项目的代码,解析文本数据存入数据库老是没有解析完就结束了,
查看logcat的打印日志,报异常 db was leaked。但是不清楚具体是在哪里崩的,所以就启用strictmode模式查看
在相应的activity里加上,
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
果然,报错,提示就只说某个东西没有关闭,
我感觉就两个原因,一个数据库打开后没有关闭,一个就是cursor没有关闭,检查他的代码,又在所有的finally里面把cursor关闭,但是还是报错。
最后查看他的获取SQLiteOpenHelper的代码,果然
他用的是单例模式打开数据库
代码是这样的
public synchronized static SQLiteOpenHelper getInstance(Context context,String databasepath) {
if (mIntances == null || !dbPath.equals(databasepath)) {
mIntances = new DataBaseHelper(context, databasepath,
null, VERSION);
dbPath=databasepath;
}
return mIntances;
}
根据传来的数据库地址打开数据库,而且这个类被所有的Dao使用,如果传来的路径和之前的不一样,他就new一个回去,但是忘了再new之前把当前正在打开的数据库给关了。
然后我就把代码改了一下,改成下面这个:
之后logcat就没有报错了,感觉问题应该是解决了,接触android没多久,好多都还要学啊
public synchronized static SQLiteOpenHelper getInstance(Context context,String databasepath) {
if (mIntances == null) {
mIntances = new DataBaseHelper(context, databasepath,
null, VERSION);
dbPath=databasepath;
}else{
if(!dbPath.equals(databasepath)){
mIntances.close();
mIntances = new DataBaseHelper(context, databasepath,
null, VERSION);
dbPath=databasepath;
}
}
return mIntances;
}