仅更新从资产android导入的数据库表

时间:2017-07-27 12:59:14

标签: android database sqlite upgrade

我的应用中有一个数据库。数据库由两种类型的表组成,一种是从资产中的SQLite文件导入的,另一种是在应用程序中通过java代码(查询)创建的,并且在用户开始使用应用程序时完成数据的插入。下面是我创建数据库的代码。

public SQLiteDatabase openDataBase() throws SQLException {

    File dbFile = ctx.getDatabasePath("MyAppDatabase.sqlite");

    if (!dbFile.exists()) {
        try {
            //copy data base from assets folder
            CopyDataBaseFromAsset();

            System.out.println("Copying success from Assets folder");
        } catch (IOException e) {
            throw new RuntimeException("Error creating source database", e);
        }

        return SQLiteDatabase.openDatabase(dbFile.getPath(), null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS
                        | SQLiteDatabase.CREATE_IF_NECESSARY);
    }
    return null;
}

以下是从资产中复制数据库的代码

 private void CopyDataBaseFromAsset() throws IOException {

    InputStream myInput = ctx.getAssets().open("MyAppDatabase.sqlite");

    // Path to the just created empty db
    String outFileName = getDatabasePath();

    // if the path doesn't exist first, create it
    File f = new File(ctx.getApplicationInfo().dataDir + DB_PATH_SUFFIX);
    if (!f.exists())
        f.mkdir();

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

要创建除复制数据库之外的表,我已在SQLiteOpenHelper的onCreate中创建了新表:

   @Override
public void onCreate(SQLiteDatabase db) {

    try {

        db.execSQL(//this contains the query to create new table apart loaded from assets);

    } catch (SQLException e) {
        Log.e(TAG, " Unable to create table", e);
    }
}

现在的挑战是我想要更新仅从预定义的SQLite文件复制的表,并且不希望更改由包含用户数据的查询创建的表中的任何内容。为此,我首先只删除了从SQLite文件复制的表,然后再次调用方法CopyDataBaseFromAsset(),如上所述:

if (ASSETS_DATABASE_VERSION != dbVersion) {

        //A and B are the tables copied from database
        db.execSQL("DROP TABLE IF EXISTS A");
        db.execSQL("DROP TABLE IF EXISTS B");

        try {
            CopyDataBaseFromAsset();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

阻止我的问题是,在删除并复制更新的表之后,还会删除从onCreate方法中的查询创建的表的数据,并且在进行所有研究后我无法找到任何解决方案。非常感谢任何帮助。

0 个答案:

没有答案