我在应用程序商店中发布了一个应用程序
我想在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 TABLEs放入onUpgrade()是一个选项。有些人喜欢在indeonCreate()中调用onUpgrade(),这在尝试迁移旧数据时可能会引起一些头痛。

07-28 02:19
查看更多