Java SQLite数据库不存在
编辑:为了清晰起见删除了以前的代码 根据建议,我添加了日志消息,以查看我在哪里被阻止 它似乎正确地抛出了对Java SQLite数据库不存在,java,android,sqlite,Java,Android,Sqlite,编辑:为了清晰起见删除了以前的代码 根据建议,我添加了日志消息,以查看我在哪里被阻止 它似乎正确地抛出了对checkDatabase()的调用,但没有返回以复制数据库。这是我的checkDatabase()方法: File dbFile = new File(DB_PATH + DB_NAME); if(dbFile.exists()){ Log.d("True","Returned true"); return true;
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()
?从您的设备卸载应用程序,然后重试,但将/databases/
添加到您的DB\u路径中
private静态字符串DB_PATH=“/data/data/com.example.mydbapp/databases/”代码>
据我所知,它应该一直存在,我在createDatabase
方法中没有看到它
稍后尝试通过sqlite3访问以检查是否正确创建了它
要使用sqlite3,请在emulator实例上输入一个远程shell,如上所述,然后使用sqlite3命令调用该工具。或者,在调用sqlite3时,可以指定要浏览的数据库的完整路径。Emulator/device实例将SQLite3数据库存储在文件夹/data/data//databases/ 中
下面是一个例子:
adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`
从设备上卸载应用程序,然后重试,但将/databases/
添加到DB\u路径中
private静态字符串DB_PATH=“/data/data/com.example.mydbapp/databases/”代码>
据我所知,它应该一直存在,我在createDatabase
方法中没有看到它
稍后尝试通过sqlite3访问以检查是否正确创建了它
要使用sqlite3,请在emulator实例上输入一个远程shell,如上所述,然后使用sqlite3命令调用该工具。或者,在调用sqlite3时,可以指定要浏览的数据库的完整路径。Emulator/device实例将SQLite3数据库存储在文件夹/data/data//databases/ 中
下面是一个例子:
adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`
我想试试这个:
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;
}
}
首先,更改该路径字符串
private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";
接下来,对该文件执行相同的检查,但如果该目录不存在,则创建该目录。无论如何,你必须这样做;这就是Android的SQLite实现默认保存DB的地方
所以试试这个:
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);
}
也许我这里遗漏了什么,但你不是在读两个不同的输入流吗?我也不明白为什么在createDatabase()中调用此函数:
该函数将调用onCreate,它将调用createDatabase,如果checkDatabase()返回false,它将再次调用onCreate。我在谷歌上搜索到的链接:
祝你好运。我想试试这个:
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;
}
}
首先,更改该路径字符串
private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";
接下来,对该文件执行相同的检查,但如果该目录不存在,则创建该目录。无论如何,你必须这样做;这就是Android的SQLite实现默认保存DB的地方
所以试试这个:
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);
}
也许我这里遗漏了什么,但你不是在读两个不同的输入流吗?我也不明白为什么在createDatabase()中调用此函数:
该函数将调用onCreate,它将调用createDatabase,如果checkDatabase()返回false,它将再次调用onCreate。我在谷歌上搜索到的链接:
祝好运。
请考虑使用测试、调试和支持的<代码> SqtLaseSeSelp>代码>代替此代码:这不起作用。甚至有一点。它对许多其他人来说是有效的,与你正在工作的代码库形成对比,很多人都有问题,正如所有关于它的堆栈溢出问题所证明的。请考虑使用测试、调试和支持的<代码> SqtLaseSeSelp>(代码)>代替这段代码:这不起作用。哪怕是一点点。它对很多其他人都有效,与你正在使用的代码库形成对比,很多人都有问题,所有关于它的StackOverflow问题都证明了这一点。谢谢你的解释。你的困惑是正确的,这是一个打字错误,从以前的版本的尝试。我倾向于模糊地命名我所有的变量,并试图在这里进行更新,使其对读者有意义。我做了你建议的改变,结果还是一样的。无法打开数据库。由于我检查了文件资源管理器,但目录不存在,所以在创建之前出现了一些问题。如果是这种情况,它甚至没有点击createDataBase()
方法,因为第一个调用是checkDatabase()
将创建目录并返回false。想法?添加对logcat的呼叫,您认为它正在崩溃。放置:Log.d(“MESSAGE_TAG_HERE”,“MESSAGE_HERE”);例如,在checkDatabase中,在条件if(db.exists())中放入该Log.d代码,并显示消息“db exists!”等。此外,在您发布的logcat中,它表示您的文件DBSQLiteHelper的第100行有错误。它在openDatabase函数中。也许你会在那里找到什么,我不知道。好主意。我快要发疯了,我已经尝试了3天,今天花了几个小时试图找到解决方案。我现在在想,如何实例化对DBSQLiteHelper的调用?我的应用程序在我的第一个活动中正确打开,但当我进入第二个活动(尝试使用数据库)时它失败。就好像