我使用GreenDA作为ORM并使用由SQLite Cipher加密的预先填充的数据库。加密是GreenDAO的特色。因此,当用户启动应用程序时,我使用下面的代码将数据库从资产复制到手机内存。
ContextWrapper cw =new ContextWrapper(context);
if (android.os.Build.VERSION.SDK_INT >= 17) {
DB_PATH = cw.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
byte[] buffer = new byte[1024];
OutputStream myOutput = null;
int length;
InputStream myInput = null;
try
{
myInput = mContext.getAssets().open(DB_NAME);
myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
while((length = myInput.read(buffer)) > 0)
{
myOutput.write(buffer, 0, length);
}
myOutput.close();
myOutput.flush();
myInput.close();
但在某些设备上,它显示以下错误
“Exception java.io.FileNotFoundException:/data/user/0/com.example.appname/databases/my-db.db:open failed:ENOENT(No such file or directory)”
并根据firebase崩溃报告,以下行负责该错误。
myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
如何解决此问题并确保数据库可以在所有设备中运行。但是我使用下面的代码检查数据库是否存在
File file = new File(DB_PATH+ DB_NAME);
if(file.exists()) {
}
答案 0 :(得分:0)
目录
/data/user/0/com.example.appname/databases
尚不存在。
在您尝试在其中编写文件之前,请检查该目录是否存在以及是否创建该目录。
if(file.getParentFile().exists())
if(!file.getParentFile().mkdirs())
return false.