如何在添加新列后使用ActiveAndroid更新表格

7
感谢您的阅读和帮助 :)
我正在使用ActiveAndroid 3.0 - Android 2.2 - 在我的应用程序中,我有一个名为"user"的模型。最初,我只创建了(id,name,passcode)列/属性的模型,在模拟器上运行应用程序,并且它可以正常工作。
@Table(name = "user")
public class User extends Model {
  @Column (name = "name")  
  public String name;
  @Column (name = "pass_code")
  public String passCode;
}

然后我添加了一个新的列/属性 - profileImage。我在模拟器上运行应用程序,结果出现了“SQLite列profileImage不存在”的错误。

@Table(name = "user")
public class User extends Model {
  @Column (name = "name")  
  public String name;
  @Column (name = "pass_code")
  public String passCode;
  @Column (name = "profile_image")
  public String profileImage;
}

我尝试了更改ActiveAndroid数据库名称并在清单文件中更新数据库版本属性。

<meta-data android:name="AA_DB_NAME" android:value="my_app.db" />
<meta-data android:name="AA_DB_VERSION" android:value="2" />

但是我一直收到“列不存在”的错误。

ERROR   AndroidRuntime  Caused by: android.database.sqlite.SQLiteException: 
no such column: profile_image: , while compiling: SELECT * FROM user WHERE profile_image = ?

我也尝试了从模拟器中卸载该应用程序、重启模拟器以及调用ActiveAndroid.cacheClear()。到目前为止,这些都没有起作用。
非常感谢您的帮助。谢谢。
2个回答

22

从你所说的情况来看,你缺少升级脚本,以将你的user表迁移到新模式。升级脚本基本上包含了如何从数据库的旧状态到达新状态的指令。在你的具体情况下,你需要告诉SQLite它应该向现有的用户表添加一个名为profile_image的新列。

要从模式1升级你的数据库到模式2,请将AA_DB_VERSION值提升到2并将升级脚本命名为2.sql。将文件保存在assets/migrations下,并给它以下内容:

ALTER TABLE user ADD profile_image TEXT;

脚本可以包含任何一组SQL语句,这些语句可以通过SQLiteDatabaseexecSQL(...)方法执行。

有关Active Android模式迁移的更多详细信息,请参见GitHub项目页面上wiki


1
出于好奇,卸载并重新安装应用程序不应该起作用吗?或者卸载应用程序并不会同时删除数据库吗? - Joshua Pinter
1
@JoshPinter:是的,卸载应用程序应该可以解决问题。事实上,点击“清除数据”也应该可以解决问题。但这不是长期解决方案,因为您可能不希望您的应用程序用户经历这个过程。正确的方法是提供适当的模式升级逻辑。 - MH.
@MH。当然。只是好奇为什么那对于 OP 没有起作用。 - Joshua Pinter
@JoshPinter:我只能猜测原帖作者在解决升级问题时搞混了什么。不确定,因为移除应用程序也应该始终移除通过SQLiteOpenHelper创建的任何数据库。 - MH.
2
@JesusDimrix:不,升级脚本是累积的。也就是说,如果数据库版本为2,新版本为5,升级过程将首先执行3.sql,然后执行4.sql,最后执行5.sql。(您可以在ActiveAndroid的#executeMigrations()中轻松看到这一点)换句话说:您不应该将更改从一个升级脚本复制到下一个升级脚本中。 - MH.
显示剩余2条评论

1
"TEXT"标签在使用ActiveAndroid进行数据库迁移时被更改为"VARCHAR"。
除了"TEXT"之外,所有其他保留字都已突出显示。我使用了"VARCHAR",并且它起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接