我的应用中有一个数据库。数据库由两种类型的表组成,一种是从资产中的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方法中的查询创建的表的数据,并且在进行所有研究后我无法找到任何解决方案。非常感谢任何帮助。