我在我当前的android项目中使用了realm,版本 0.79.0 。现在我想将领域版本更新为 0.84.0 ,并且还希望在Application类中使用RealmConfiguration
来使用Realm.getDefaultInstance()
而不是Realm.getInstance(context)
进行领域初始化。< / p>
我实现了新的realm版本并且还更改了必要的配置。但是当我运行我的应用程序时,它会因错误而崩溃
必须提供领域迁移
以为我没有改变任何模特课。
任何人都可以告诉我如何在没有任何迁移的情况下使用Android的默认配置更改领域版本?如果没有迁移是不可能的,那么迁移类会是什么样的呢?
答案 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
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
的示例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>