无法在android中加载数据库文件

时间:2017-07-07 02:37:52

标签: android sqlite

我有一个名为MainExerciseDatabaseOne.db的sqlite数据库文件存储在我的app / src / main / assets / databases文件夹中。我正试图在我的主要活动的功能中打开文件:

private ExerciseDb createDatabase(){
    final String inFileName = "/data/data/<mypackage>/databases/MainExerciseDatabaseOne.db";
    File dbFile = new File(inFileName);
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(dbFile);
    } catch (FileNotFoundException e) {
        Log.e("error",e.toString());
    }
    String outFileName = DB_PATH + ExerciseDb.DATABASE_NAME;
    // Open the empty db as the output stream
    OutputStream output = null;
    try {
        output = new FileOutputStream(outFileName);
    } catch (FileNotFoundException e) {
        Log.e("error",e.toString());
    }
    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    try {
        while ((length = fis.read(buffer))>0){
            output.write(buffer, 0, length);
        }
    } catch (IOException e) {
        Log.e("error",e.toString());
    }

    // Close the streams
    try {
        output.flush();
        output.close();
        fis.close();
    } catch (IOException e) {
        Log.e("error",e.toString());
    }
    ExerciseDb ret = new ExerciseDb(this);
    return ret;
}

但是我在行上找到了一个未找到文件的例外:

 fis = new FileInputStream(dbFile);

在每个教程中,我看到这似乎是访问此文件的正确途径,所以我不确定为什么它不起作用。它也很奇怪,因为这个确切的代码确实有效,直到我在我的手机上卸载应用程序并做了一个干净的构建并从android studio重新安装应用程序

2 个答案:

答案 0 :(得分:0)

尝试:

  1. com.example.package
  2. 中使用您的包名称(例如myactivity)代替/data/data/com.example.package/databases/MainExerciseDatabaseOne.db
  3. mkdirs用于/data/data/com.example.package/databases/。我不确定默认情况下该目录是否存在。
  4. 使用无延伸的文件(仅建议):MainExerciseDatabaseOne.db&gt; MainExerciseDatabaseOne

答案 1 :(得分:0)

MainExerciseDatabaseOne.db放入app/src/main/assets/databases不会使其自动复制到应用数据库位置(/data/data/<mypackage>/databases/MainExerciseDatabaseOne.db)。数据库仍在您的应用程序中。

我之前尝试过同样的事情(包括数据库)。我就是这样做的。

MainExerciseDatabaseOne.db放入app/res/raw/。然后,您可以通过文件流访问数据库并将其复制到应用程序数据库位置。

try{
    File db = new File(DB_PATH + ExerciseDb.DATABASE_NAME)
    InputStream in = context.getResources().openRawResource(R.raw.ExerciseDb)
    final FileOutputStream out = new FileOutputStream(dbFile);
    final byte[] buff = new byte[1024];
    int read;
    while ((read = in.read(buff)) > 0) {
        out.write(buff, 0, read);
    }
    in.close();
    out.close();
} catch (IOException ignored) {
}

然后,您可以SQLiteOpenHelper使用MainExerciseDatabaseOne.db作为名称正常访问它。

如果您坚持使用资产文件夹,可以试试这个。我测试了它但它应该可以工作。

InputStream in = context.getResources().getAssets().open("MainExerciseDatabaseOne.db")