我正在为我的应用程序的SQLite DB添加一个表。我的所有语法都很好,而不是问题。但是我在创建新表时遇到了一些麻烦。我添加了新表....
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
db.execSQL(CREATE_REQUESTS);
db.execSQL(CREATE_OVERRIDE);
}
我的创建方法。我有3张桌子。当我更新版本号时,我收到一条错误消息“已经创建了表请求(指的是CREATE_REQUESTS)。”看看我的onUpgrade方法...
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
让我理解,引用onCreate方法中的DATABASE_CREATE表的行db.execSQL("DROP TABLE IF EXISTS contacts")
用于删除旧表,然后下一行onCreate(db);
重新创建它。我没有向execSQL行添加请求,这是导致错误的原因。这是问题:我宁愿不丢失我已经拥有的两个表中的数据。有没有办法添加像我正在尝试做的表,而不是丢失所有旧数据?感谢。
答案 0 :(得分:13)
您可以在onUpgrade
中执行任何操作。您可以使用ALTER
向表中添加新列。
最糟糕的情况是,如果您的架构完全不同,则必须创建新表,使用旧表中的数据填充它,然后删除旧表。
无论如何,onUpgrade
旨在实现平滑升级而不会丢失任何数据。您可以正确实施它。
答案 1 :(得分:0)
如果数据库版本:6
Ex : There is a table with 5 columns
升级到:7 (我在3个表格中添加1个新列)
1. We need to add the columns when creating a table
2. onUpgrade method:
if (oldVersion < 7)
{
db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
db.execSQL(DATABASE_ALTER_PAPER_LABEL);
}
其中:“DATABASE_ALTER_ADD_PAPER_PAID”是查询。
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
+ TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
完成上述两项操作后,它将适用于全新安装用户和应用升级用户