编辑:删除以前的代码以获得清晰度
根据建议,我添加了日志消息以查看我被阻止的位置。
它似乎正在向checkDatabase()
正确抛出调用,但不会返回复制数据库。这是我的checkDatabase()
方法:
File dbFile = new File(DB_PATH + DB_NAME);
if(dbFile.exists()){
Log.d("True","Returned true");
return true;
}else{
dbFile.getParentFile().mkdirs();
Log.d("CreatedPath","Made the right directory");
return false;
}
在调试日志中,我可以看到“创建路径”消息。所以它已经走得那么远了。
然后返回false, 应该启动它:
public void createDataBase() throws IOException{
boolean dbExist = checkDatabase();
if (!dbExist){
this.getReadableDatabase();
// Calling this method an empty database will be
// created into the default system path of
// the app so we can overwrite with FirstDB.
try{
copyDatabase();
}catch (IOException e) {
throw new Error("Error copying database");
}
}
}
但是,我根本没有看到这些日志消息。这就像它返回false并继续前进。
我是否需要再次致电createDataBase()
?
答案 0 :(得分:2)
我试试这个:
首先,更改该路径字符串
private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";
接下来,对文件执行相同的检查,但如果目录不存在则创建该目录。无论如何你必须;这是Android的SQLite实现默认保存数据库的地方。
所以试试这个:
private boolean checkDatabase(){
File dbFile = new File(DB_PATH + DB_NAME);
if(dbFile.exists()){
return true;
}
else{
//This'll create the directories you wanna write to, so you
//can put the DB in the right spot.
dbFile.getParentFile().mkdirs();
return false;
}
}
无论如何,这只是通过一些谷歌搜索,以及我所知道的最重要的事情。底部的链接。
另外,我有点困惑:
//YOU NAME THIS myInput:
InputStream myInput = firstDBContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream bnOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
//YOU READ FROM bnInput:
while ((length = bnInput.read(buffer)) > 0){
bnOutput.write(buffer, 0, length);
}
也许这里有一些我不知道的东西,但是你不是从两个不同的InputStream中读取的吗?我也不明白你为什么在createDatabase()中调用这个函数:
this.getReadableDatabase();
该函数将调用onCreate,它调用createDatabase,如果checkDatabase()返回false,它将再次调用onCreate。链接到我用Google搜索的内容:
Java's createNewFile() - will it also create directories?
https://stackoverflow.com/a/9865386/2015759
http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs%28%29
祝你好运。答案 1 :(得分:1)
从您的设备卸载该应用,然后重试,但将/databases/
添加到您的DB_PATH
。
private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";
我知道它应该永远存在,我不会在你的createDatabase
方法上看到它。
稍后尝试通过sqlite3访问以检查它是否正确创建。
要使用sqlite3,请在仿真器实例上输入远程shell,如上所述,然后使用sqlite3命令调用该工具。 (可选)在调用sqlite3时,您可以指定要浏览的数据库的完整路径。仿真器/设备实例将SQLite3数据库存储在 / data / data /<文件夹中package_name> / databases / 。
以下是一个例子:
adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`