如何将先前的数据库与新版本的sqlite数据库合并- Android
如何将先前的数据库与新版本的sqlite数据库合并- Android
我在playstore上有一个应用程序,其中包含一个数据库。
现在在新版本中,数据库已更改,添加了一个新的表。
目前我正在使用sqlite studio,并将数据库文件放在assets中,然后将其复制为应用程序数据库。请参考此示例。
我必须删除以前的数据库以复制新的数据库,或者如果我复制新的数据库(覆盖),在这两种情况下用户数据都会丢失。
也许我可以将新的表附加到当前数据库,但如果我必须在以前的数据库中的表中添加列呢?
我应该如何处理这个问题?
编辑:如果我必须复制数据库中的数据并重新插入,我如何知道当前存在于我的数据库中的表和列。
请指导我...
在Android中,如何将之前的数据库与新版本的数据库sqlite合并?
解决方法:
1. 将数据库中的所有数据获取到ArrayList或其他数据结构中,并删除旧数据库,然后创建新的数据库,并将所有数据插入到新数据库中。
2. 创建一个包含所有列的对象ArrayList,用于存储数据库中的所有表和列名。
3. 可以通过以下链接获取当前应用数据库中存在的表和列名:
表名:stackoverflow.com/questions/17185269/…
列名:stackoverflow.com/questions/2382528/…
4. 可能需要实现一个整体类来完成你想要的操作。
5. Android实际上包含了一种机制,可以帮助升级数据库版本。网页vogella.com/tutorials/AndroidSQLite/…中的第4章描述了如何使用sql。此外,你还可以通过命令INSERT INTO Destination SELECT * FROM Source;
将一个表的数据复制到另一个表(临时表)中。这将把Source
表中的所有数据复制到Destination
表中。
问题的原因是需要将之前的数据库与新版本的数据库进行合并。解决方法是在更新方法中添加创建新表的语句,并将数据重新插入。
对于新表,只需在更新方法中添加创建表的语句。
对于新列,在一个数组中复制所有数据,重新创建表并重新插入数据。
如果需要从数据库复制数据并重新插入,如何知道当前数据库中存在的表和列。
假设在数据库的v3版本中添加了一列,在onUpgrade中,检查oldVersion的值,如果在v3之前,说明是没有这个新列的表。(对于表格也是同样的情况,将数据库的修改记录在某个地方,以了解在哪个版本中创建了这个表...)我使用一个字符串数组来存储列名(和顺序),你可以使用这个数组来存储旧的结构(每个表的每个版本一个数组,以了解表的结构)。
以下是代码示例:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ if(oldVersion < LastVersionWithoutTheTable && newVersion >= LastVersionWithoutTheTable){ db.execSQL(CREATE_THE_TABLE); } }
以上是解决合并之前和新版本数据库的方法。