我在应用程序商店中发布了一个应用程序
我想在sqlite数据库的用户表中添加一个新列,并希望它不为空
但我也希望老用户能够使用这个应用
如果旧用户使用新版本更新他们的应用程序,会发生什么情况?登录时,我从服务器获取信息并将其插入数据库。当新列没有值时,数据库插入可能会停止
另外,如何进行升级?
在onupgrade中我做“alter table user…”
在sqlite助手的构造函数中,我添加了新的db版本
还有什么?
另外,我还添加了3-4个全新的表,这些表是新特性所必需的。我在sqlite助手的oncreate方法中调用了它们的create查询。除此之外,我还要做什么吗?
最佳答案
在sqlite助手的构造函数中,我添加了新的db版本
这将触发onUpgrade()
,很好。
但是,不能使用ALTER TABLE
添加带有NOT NULL
的列。
您可以在onUpgrade()
中执行以下操作来保存用户数据:
将旧表重命名为临时名称
用新列重新创建表并NOT NULL
从旧临时表填充新表,并为新列提供合理的非空默认值
删除临时表
你能给我一个例子让我说,表被称为用户与字段名称和电子邮件,现在我想添加一个新的字段年龄?
下面是一个例子:
sqlite> create table user(name, email);
sqlite> insert into user select 'foo','bar';
sqlite> alter table user rename to user_temp;
sqlite> create table user(name, email, age not null);
sqlite> insert into user select name,email,-1 from user_temp;
sqlite> drop table user_temp;
sqlite> select * from user;
name|email|age
foo|bar|-1
另外,我还添加了3-4个全新的表,这些表是新特性所必需的。我在sqlite助手的oncreate方法中调用了它们的create查询。除此之外,我还要做什么吗?
我应该在oncreate和onupgrade中为新表添加新的create,还是只在onupgrade中?
确保在
onUpgrade()
中创建相同的新表。onCreate()
仅在首次创建数据库时运行,而不是在升级时运行。在
onCreate()
和onUpgrade()
之后,数据库模式(表结构)应该是兼容的。如何实现它取决于你自己。将CREATE TABLE
s放入onUpgrade()
是一个选项。有些人喜欢在indeonCreate()
中调用onUpgrade()
,这在尝试迁移旧数据时可能会引起一些头痛。