我读了很多问题&答案与我的问题有关,但我没有得到正确的方法。
Condtion:
我在SQLite
数据库中有三个表。我希望在应用程序获得更新时更新两个(TBL_NAMES
,TBL_CATEGORY
)表的数据,而不会丢失第三个表(TBL_FEVORITE
)的数据。
我的应用程序将脱机工作,因此新记录将通过SQLite
数据库提供给我。
我做了什么?
我确实将更新后的数据库放在资产文件夹中,并试图从我的`DatabaseHelper'但是,它无法访问。
我尝试创建两个不同的数据库(一个用于TBL_NAMES
& TBL_CATEGORY
,另一个用于TBL_FEVORITE
但是没有成功。
请建议我该怎么做?如果我使用两个数据库,如何保持两个数据库处于打开状态,或者如何从更新的数据库更新数据库,除了一个表。
答案 0 :(得分:2)
我不确定我是否理解你的问题,
但是您不能在两个(或更多)数据库上使用SQL JOIN
。您只能JOIN
同一数据库的表。如果你真的想要JOIN
数据库,那么你必须手动完成
即从database1.tableA查询记录列表,查询来自database2.tableB的记录列表,然后将它们保存在以连接条件为键的哈希映射中并加入它们并保存连接结果
更新:
好的,所以如果你想通过应用程序更新将“newDatabase”(提供给你)中的记录添加到“usersDatatbase”(你的应用程序用户的当前数据库),你只需要对数据库进行版本控制。 android中的每个数据库都有一个版本,您可以对SQLiteOpenHelper
onUpgrade()中的版本更改做出反应。通常你会使用这种方法来改变表模式,但我认为你要做的事情完全没问题。因此,我们假设您已使用final int DATABASE_VERSION = 1
将应用程序发布到Play商店。几周后,您决定更新数据库。因此,您需要设置final int DATABASE_VERSION = 2
(将数据库版本设置为2)并将新更新发布到Playstore。如果您的应用程序的用户从playstore安装您的更新(数据库版本== 2),将调用onUpgrade()
,您将检查旧版本的数据库和新版本并执行数据迁移(即重命名使用新提供的名称)。一个月后,您希望将数据库更新为final int DATABASE_VERSION = 3
,依此类推。我希望你明白这一点。您唯一需要记住的是,用户可以跳过应用的Playstore更新。例如,应用版本1的用户尚未更新到版本2,而是直接从版本1升级到3.在这种情况下,您可能(取决于您要应用的数据库更改)必须从数据库从1迁移到2并且然后从2到3。
示例:
public class MySQLiteHelper extends SQLiteOpenHelper {
public static final String TABLE_COMMENTS = "comments"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_COMMENT = "comment";
private static final String DATABASE_NAME = "commments.db"; private static final int DATABASE_VERSION = 3;
// Database creation sql statement private static final String DATABASE_CREATE = "create table "
+ TABLE_COMMENTS + "(" + COLUMN_ID
+ " integer primary key autoincrement, " + COLUMN_COMMENT
+ " text not null);";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION); }
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion == 2){
migrateFrom1To2(db);
}
if (newVersion == 3){
if (oldVersion == 1){
migrateFrom1To2(db);
migrateFrom2To3(db);
} else {
// oldversion == 2
migrateFrom2To3(db);
}
}
}
private void migrateFrom1to2(SQLiteDatabase db){
// TODO insert the new data into the users local database
}
private void migrateFrom2To3(SQLiteDatabase db){
// TODO insert the new data into the users local database
}
}