Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite数据库不存在_Java_Android_Sqlite - Fatal编程技术网

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的调用?我的应用程序在我的第一个活动中正确打开,但当我进入第二个活动(尝试使用数据库)时它失败。就好像