尝试将SQLite数据库从资产内存复制到手机内存时,为什么文件无法创建?

时间:2018-01-03 15:46:20

标签: android database sqlite greendao

我使用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()) {
          }

1 个答案:

答案 0 :(得分:0)

目录

/data/user/0/com.example.appname/databases

尚不存在。

在您尝试在其中编写文件之前,请检查该目录是否存在以及是否创建该目录。

if(file.getParentFile().exists()) 
    if(!file.getParentFile().mkdirs())
         return false.