我有一个名为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重新安装应用程序
答案 0 :(得分:0)
尝试:
com.example.package
myactivity
)代替/data/data/com.example.package/databases/MainExerciseDatabaseOne.db
mkdirs
用于/data/data/com.example.package/databases/
。我不确定默认情况下该目录是否存在。答案 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")