如果需要迁移,域不会自动删除数据库

时间:2016-01-23 08:46:56

标签: android realm

我们正处于开发阶段,并且经常会发生数据库架构更改。由于我们不在线,因此不需要迁移。我因此配置Realm如下:

RealmConfiguration config = new RealmConfiguration.Builder(context)
                .name("jt.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded() // todo remove for production
                .build();
        Realm.setDefaultConfiguration(config);

但是,当架构更改时,会抛出异常:RealmMigration must be provided

我对文档的理解是,Realm应该自动删除数据库,因为配置中存在deleteRealmIfMigrationNeeded(),但这似乎并没有发生。为什么会这样?

Android Studio依赖

编译' io.realm:realm-android:0.86.1'

2 个答案:

答案 0 :(得分:2)

我们遇到了类似的问题。我们通过添加

解决了这个问题
Realm.getInstance(config)

之后

Realm.setDefaultConfiguration(config);

我们认为配置将在Realm首次调用后设置。这次我们不使用任何Realm对象,所以没有例外。

答案 1 :(得分:2)

如果有人遇到同样的问题,你可以根据Dagger2查看我所做的事情。超级迟到的答案。

首先创建一个模块:

@Module
public class DatabaseModule {

    public DatabaseModule(Context context) {
        Realm.init(context);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("mydb.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();

        Realm.setDefaultConfiguration(config);
    }

    @Provides
    Realm provideRealm() {
        return Realm.getDefaultInstance();
    }
}

它的Context来自另一个模块

@Module
public class ApplicationModule {
    private Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Context provideContext() {
        return application;
    }
}

这是你的App级别组件:

@Singleton
@Component(modules = {ApplicationModule.class, DatabaseModule.class, NetworkModule.class})
public interface ApplicationComponent {

    void inject(HomeActivity activity);
}

最后在你的Activity / Fragment中使用它:

public class HomeActivity {

@Inject Realm mRealm;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupDependencyInjection();
        setContentView(R.layout.activity_home);

        // Now you can use Realm
    }

    private void setupDependencyInjection() {
        ((YourApplication) getApplication())
                .getAppComponent()
                .inject(this);
    }
}