Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.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
Android 脆弱的SQLite实现-如何改进?_Android_Sqlite - Fatal编程技术网

Android 脆弱的SQLite实现-如何改进?

Android 脆弱的SQLite实现-如何改进?,android,sqlite,Android,Sqlite,我的应用程序严重依赖于数据库,当应用程序第一次打开时,它应该将自己从/assets/文件夹复制到数据库存储中。然而,它似乎令人难以置信的喜怒无常:例如,我的免费和付费版本中的代码几乎完全相同,但其中一个目前正在工作,另一个则没有 你们介意看一下我的代码,看看有什么可以改进的地方吗?可以找到我的SQLiteOpenHelper,我的DataProvider的onCreate()方法如下: @Override public boolean onCreate() { dh = new Dat

我的应用程序严重依赖于数据库,当应用程序第一次打开时,它应该将自己从
/assets/
文件夹复制到数据库存储中。然而,它似乎令人难以置信的喜怒无常:例如,我的免费和付费版本中的代码几乎完全相同,但其中一个目前正在工作,另一个则没有

你们介意看一下我的代码,看看有什么可以改进的地方吗?可以找到我的
SQLiteOpenHelper
,我的
DataProvider
onCreate()
方法如下:

@Override
public boolean onCreate() {

    dh = new DatabaseHelper(getContext());
    try {

        dh.createDataBase();

    } catch (IOException ex) {

    }
    try {

        dh.openDataBase();

    } catch (SQLiteException ex) {

        Toast.makeText(getContext(), "The database could not be copied\n" + ex.getMessage(), 
                Toast.LENGTH_LONG).show();

    }

    return true;

}
谢谢

编辑


在试用了emulator之后,我知道数据库存在,但出于某种原因,它只是不想读取它…

下面是我用来复制数据库的代码(不确定它是否可以修复错误,我认为另一种方法总是值得一试)。否则,我看不到任何可能导致错误的跳出

void copyFile(File src, File dst) throws IOException {
        FileChannel inChannel = new FileInputStream(src).getChannel();
        FileChannel outChannel = new FileOutputStream(dst).getChannel();
        try {
           inChannel.transferTo(0, inChannel.size(), outChannel);
        } finally {
           if (inChannel != null)
              inChannel.close();
           if (outChannel != null)
              outChannel.close();
        }
     }
另外,在检查数据库是否存在时,为什么要打开和关闭数据库。看来你可以这样做:

private boolean checkDataBase() {
    String myPath = DB_PATH + DB_NAME;
    return new File(myPath).exists();
}

您不应该对数据库目录的路径进行硬编码。不要每次需要时都构建myPath,而是尝试使用以下代码在构造函数中构建它:

实例:

private File myPath;
在构造器中:

myPath =  context.getDatabasePath(DB_NAME);

如果有帮助的话,我当前得到的错误是,由于找不到表,对db的查询失败。我不知道这些表是否存在,虽然我没有收到错误,说不能复制。数据库有多大(mb)?@Farray,60KB太小了