如何使用Sugar Orm升级数据库?

时间:2016-04-12 13:06:02

标签: android android-database sugarorm

我有一个简单的实体:

public class MyEntity extends SugarRecord {

    String name;
    int    value;

    public MyEntity() {
        //empty ctr for sugar orm
    }

    public MyEntity(String name, int value) {
        this.name = name;
        this.value = value;
    }
}

在应用程序启动时,我创建一个实例并将其保存为:

  Log.i("db_test", "count_before: "+MyEntity.count(MyEntity.class)+"");
  new MyEntity("name", 10).save();
  Log.i("db_test", "count_after: "+MyEntity.count(MyEntity.class)+"");

在日志中我可以看到:

04-12 14:58:52.538: I/db_test(10691): count_before: 0
04-12 14:58:52.555: I/Sugar(10691): MyEntity saved : 1
04-12 14:58:52.555: I/db_test(10691): count_after: 1

运作良好。

那么如果我决定要向MyEntity类添加属性该怎么办呢。像这样:

public class MyEntity extends SugarRecord {

    String name;
    int    value;
    int    anotherValue; ///< A new property.
//...

在此之后,我增加了Databse版本,因为模型已更改。 所以我将清单中的以下字段从1增加到2。

  <meta-data
   android:name="VERSION"
   android:value="2"/>

这次我运行我的应用时出现以下错误:

E/SQLiteLog(11125): (1) table MY_ENTITY has no column named ANOTHER_VALUE

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: 

android.database.sqlite.SQLiteException: table MY_ENTITY has no column named ANOTHER_VALUE (code 1): , while compiling: INSERT OR REPLACE  INTO MY_ENTITY(ANOTHER_VALUE,ID,VALUE,NAME) VALUES (?,?,?,?)

那为什么会这样呢?

我在我的Java对象上创建了这个属性。

我增加了数据库版本。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

虽然它不是理想的解决方案,但使用升级文件手动更改表应该允许插入/替换工作。

AFAIK,VERSION值仅用于识别是否应运行补丁。

在您的情况下,可能会将名为“2.sql”的文件添加到assets/sugar_upgrades/文件夹中,其中包含:

ALTER TABLE my_entity ADD COLUMN another_value int;

来源:SugarORM