更新Realm数据库版本

时间:2015-10-28 08:53:30

标签: android realm

我在我当前的android项目中使用了realm,版本 0.79.0 。现在我想将领域版本更新为 0.84.0 ,并且还希望在Application类中使用RealmConfiguration来使用Realm.getDefaultInstance()而不是Realm.getInstance(context)进行领域初始化。< / p>

我实现了新的realm版本并且还更改了必要的配置。但是当我运行我的应用程序时,它会因错误而崩溃

  

必须提供领域迁移

以为我没有改变任何模特课。

任何人都可以告诉我如何在没有任何迁移的情况下使用Android的默认配置更改领域版本?如果没有迁移是不可能的,那么迁移类会是什么样的呢?

3 个答案:

答案 0 :(得分:2)

您需要迁移,因为我们在0.83.0中引入了对RealmMigration migration = new RealmMigration() { @Override public long execute(Realm realm, long version) { Table table = realm.getTable(Dog.class); // Needed for all Strings table.convertColumnToNullable(table.getColumnIndex("name")); return 1; } }; RealmConfiguration realmConfig = new RealmConfiguration.Builder(getContext()) .schemaVersion(1) .migration(migration) .build(); 值的支持。您可以在此处详细了解如何迁移:https://realm.io/news/realm-java-0.83.0/

但您需要添加类似于以下内容的迁移:

/var/www

答案 1 :(得分:1)

好吧,你可能已经跳过许多重大变化。见changelog

0.82

  

BREAKING CHANGE:带注释@PrimaryKey的字段现在自动编入索引。较旧的模式需要迁移。

您的Migration类应如下所示:

#ifndef WFRACTAL_FRACTAL_METADATA_H_
#define WFRACTAL_FRACTAL_METADATA_H_

#include <string>

namespace WFractal {
namespace Fractal {

class Metadata {

public:

    void setAuthorName(const std::string &name);
    void setAuthorEMail(const std::string &email);
    void setBriefDescription(const std::string &brief);
    void setCompleteDescription(const std::string &description);
    std::string getAuthorName() const;
    std::string getAuthorEMail() const;
    std::string getBriefDescription() const;
    std::string getCompleteDescription() const;

public:

    bool operator==(const Metadata &other);

private:

    std::string m_name;
    std::string m_email;
    std::string m_brief;
    std::string m_description;
};

} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_METADATA_H_

来自here

的示例

0.83

  

BREAKING CHANGE:引入了盒装类型Boolean,Byte,Short,Integer,Long,Float和Double。添加了空支持。引入注释@Required以指示字段不可为空。字符串,日期和字节[]默认为可为空,这意味着如果打开以前版本的Realm文件,将抛出RealmMigrationNeededException。

您的Migration类应如下所示:

boost::spirit

来自here

的示例

答案 2 :(得分:0)

1)创建一个领域迁移类:     公共类AppRealmMigration实现RealmMigration {

@Override
public void migrate(@NonNull final DynamicRealm realm, long oldVersion, long newVersion) {

    // Access the Realm schema in order to create,
    // modify or delete classes and their fields.
    RealmSchema schema = realm.getSchema();
    //region Migrate from version 1 to version 2
    if (oldVersion == 1) {

    //add your code here...

        oldVersion++;
    }

  }
}

2)创建一个自定义Application类:

public class MyApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();
    Realm.init(this);


//cation: never changed Realm filename
//changing this default file name create a new database 
//and user after update lose are local data
    RealmConfiguration realmConfig = new RealmConfiguration.Builder()
            .name("your_realm_name")
            .schemaVersion(2)
            .migration(new AppRealmMigration())
            .build();

    Realm.setDefaultConfiguration(realmConfig);
}
}

3)将此类名称添加到您的应用清单中:

<application
   android:name=".MyApplication"
   android:icon="@mipmap/ic_launcher"
   android:label="@string/app_name"
   android:roundIcon="@mipmap/ic_launcher_round"
   android:theme="@style/AppTheme">

</application>