如何在单个应用程序中使用两个 sqlite 数据库以及如何对它们使用连接操作?
How to use two sqlite database within single application and how to use join operation with them?
我已经阅读了很多与我的问题相关的问题和答案,但我没有找到正确的方法。
条件:
我在 SQLite
数据库中有三个 table。每当我的应用程序获得更新。
我的应用程序可以离线工作,所以新记录将通过 SQLite
数据库提供给我。
我做了什么?
我确实将更新的数据库放在资产文件夹中并尝试从我的“DatabaseHelper”访问class但是,它不可访问。
我尝试创建两个不同的数据库(一个用于 TBL_NAMES
和 TBL_CATEGORY
,第二个用于 TBL_FEVORITE
)但没有成功。
请建议我该怎么做?如果我要使用两个数据库,我怎样才能保持两个数据库打开,或者我怎样才能从更新的数据库更新数据库,除了一个 table.
我不确定我是否理解你的问题,
但您不能在两个(或更多)数据库上使用 SQL JOIN
。您只能 JOIN
同一数据库的表。如果你真的想要 JOIN
个数据库,那么你必须手动完成
即从 database1.tableA 查询记录列表,从 database2.tableB 查询记录列表,然后将它们保存在以连接条件为键的散列表中并连接它们并保存连接结果
更新:
好的,所以如果你想通过应用程序更新将 "newDatabase"(提供给你)的记录添加到 "usersDatatbase"(你的应用程序用户的当前数据库),你只需对数据库进行版本控制。 android 中的每个数据库都有一个版本,您可以对 SQLiteOpenHelper
onUpgrade() 中的版本更改做出反应。通常您会使用此方法来更改 table 架构,但我认为您将要执行的操作完全没问题。因此,假设您已将应用发布到 final int DATABASE_VERSION = 1
的 Playstore。几周后,您决定更新数据库。所以你要做的是设置 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
}
}
我已经阅读了很多与我的问题相关的问题和答案,但我没有找到正确的方法。
条件:
我在 SQLite
数据库中有三个 table。每当我的应用程序获得更新。
我的应用程序可以离线工作,所以新记录将通过 SQLite
数据库提供给我。
我做了什么?
我确实将更新的数据库放在资产文件夹中并尝试从我的“DatabaseHelper”访问class但是,它不可访问。
我尝试创建两个不同的数据库(一个用于
TBL_NAMES
和TBL_CATEGORY
,第二个用于TBL_FEVORITE
)但没有成功。
请建议我该怎么做?如果我要使用两个数据库,我怎样才能保持两个数据库打开,或者我怎样才能从更新的数据库更新数据库,除了一个 table.
我不确定我是否理解你的问题,
但您不能在两个(或更多)数据库上使用 SQL JOIN
。您只能 JOIN
同一数据库的表。如果你真的想要 JOIN
个数据库,那么你必须手动完成
即从 database1.tableA 查询记录列表,从 database2.tableB 查询记录列表,然后将它们保存在以连接条件为键的散列表中并连接它们并保存连接结果
更新:
好的,所以如果你想通过应用程序更新将 "newDatabase"(提供给你)的记录添加到 "usersDatatbase"(你的应用程序用户的当前数据库),你只需对数据库进行版本控制。 android 中的每个数据库都有一个版本,您可以对 SQLiteOpenHelper
onUpgrade() 中的版本更改做出反应。通常您会使用此方法来更改 table 架构,但我认为您将要执行的操作完全没问题。因此,假设您已将应用发布到 final int DATABASE_VERSION = 1
的 Playstore。几周后,您决定更新数据库。所以你要做的是设置 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
}
}