问题情况:
我是先将数据库保存在assets目录下,在运行时拷贝在手机数据库目录中一份,最后在使用的。
于是代码简单到只有三步:
1、拷贝数据库在assets里
2、拷贝数据库到手机数据库目录中
'''
FiledatabasePath = getDatabasePath("a05cs.db");
if(databasePath.exists()) {
databasePath.delete();
}
try{
FileOutputStream fos =newFileOutputStream(databasePath);
InputStream in = getAssets().open("allarea.db");
getResources().getAssets();
byte[] b =new byte[1024*8];
intl =0;
while((l = in.read(b)) != -1) {
fos.write(b,0,l);
}
fos.close();
in.close();
}catch(IOException e) {
e.printStackTrace();
}
'''
3、打开使用数据库
'''
sqLiteDatabase= SQLiteDatabase.openDatabase(databasePath.getAbsolutePath(), null,SQLiteDatabase.OPEN_READONLY);
if(sqLiteDatabase.isReadOnly()) {//成功打开了库,但就是找不到表
Cursor cursor =sqLiteDatabase.rawQuery(" select * from DOMAIN_PROVINCE ", null);
intcount = cursor.getCount();
Log.i("Li_ke","MainActivity:onCreate: "+ count);
}
'''
出现的问题
在使用的时候报错:Cursor cursor =sqLiteDatabase.rawQuery(" select * from DOMAIN_PROVINCE ", null);提示找不到表。
问题解决
那时因为Android Device Monitor打不开data文件,也就看不到拷贝好的内容。于是就很奇怪。试过添加读写权限(失败)、修改拷贝路径(失败)、直接使用assets目录"file:///android_asset/allarea.db"(找不到文件,然而mBinding.webView.loadUrl("file:///android_asset/test.html");却是可用的)。
真正的错误原因是:没有找到assets目录下的*.db文件。
至于为什么没有拿到。我也不知道。
我是先吧getAssets();改成了getResources().getAssets();没拿到
我又在assets下加了一个文件,那个文件拿到了,db文件还没拿到
我又吧db文件改个名字A.db。这次拿到了。
我的天,我肯定没写错名字,shift+F6,代码中使用的名字也跟着改的,然而却拿到了。我又改回了名字,还是拿到了。我嘞个去。 神奇。
经验
1、遇到错误,要先锁定错误的具体位置。真正位置。(断点)
2、assets目录下可能会出现名字错误的情况,而导致未知BUG,此时重命名就好。