Android使用NOT NULL列升级数据库 - 旧用户会发生什么

时间:2014-10-07 09:34:29

标签: android sqlite

我在应用商店中发布了一款应用 我想在sqlite db中的user表中添加一个新列,并希望它不为null 但我也希望老用户能够使用该应用程序

如果旧用户使用新版本更新其应用,会发生什么?登录时,我从服务器获取信息,然后将其插入数据库。当新列

没有值时,db插入可能会停止

另外,我该如何进行升级?

  • 在onUpgrade中我做“ALTER table USER ...”
  • 在SQLite帮助程序的构造函数中,我添加了新的数据库版本

还有什么?

另外,我添加了3-4个新功能所需的新表。我在SQLite帮助器的onCreate方法中调用了他们的创建查询。除此之外,我还应该做些什么吗?

1 个答案:

答案 0 :(得分:4)

  

在SQLite帮助程序的构造函数中,我添加了新的数据库版本

这将触发onUpgrade(),好。

但是,您无法使用ALTER TABLE添加NOT NULL列。

您可以在onUpgrade()中执行以保存用户数据的内容:

  • 将旧表重命名为临时名称

  • 使用新列和NOT NULL

  • 重新创建表格
  • 从旧临时表中填充新表并为新列提供合理的非空默认值

  • 删除临时表

  

你能给我一个例子,让我们说表名为USER,字段为NAME和EMAIL,现在我想添加一个新字段AGE?

以下是一个例子:

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方法中调用了他们的创建查询。除此之外,我还应该做些什么吗?

     

我应该在onCreate和onUpgrade中或仅在onUpgrade中为新表创建新的创建?

确保在onUpgrade()中创建相同的新表。

onCreate()仅在第一次创建数据库时运行,而不是在升级时运行。

onCreate()onUpgrade()之后,数据库架构(表结构)应该是兼容的。 如何实施它取决于您。将CREATE TABLE放在onUpgrade()中是一种选择。有些人更愿意致电onCreate() insinde onUpgrade(),这可能会在尝试迁移旧数据时引起一些麻烦。