2016-11-20 71 views
1

我使用领域,所有看起来不错,直到我尝试在我的数据库中添加初始数据。在Realm中添加初始数据Android

我跟着的例子在这个answer,所以在我的课,从Application继承,我有以下几点:

public class MainApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Realm.init(this); 
     final Map<String, String> map = new LinkedHashMap(); 
     map.put("Key1", "value1"); 
     map.put("Key2", "value2"); 
     RealmConfiguration config = new RealmConfiguration.Builder().initialData(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       int i = 1; 
       for (Map.Entry entry : map.entrySet()) { 
        realm.beginTransaction(); 
        Category c = realm.createObject(Category.class, i++); 
        c.setName((String) entry.getKey()); 
        c.setDescription("Category #" + entry.getValue()); 
        realm.commitTransaction(); 
       } 
       realm.close(); 
      } 
     }).deleteRealmIfMigrationNeeded().name("realm.db").build(); 
     Realm.setDefaultConfiguration(config); 
    } 
} 

而且我认为这个配置应该工作,但是我发现了以下错误:

java.lang.IllegalStateException: The Realm is already in a write transaction in /path/...

有什么,我失踪了吗?

在此先感谢。

回答

7

删除realm.beginTransaction(),realm.commitTransaction()realm.close()调用。该public void execute(Realm realm)Realm.Transaction类的方法,它会处理启动和提交事务,为您提供:

RealmConfiguration config = new RealmConfiguration.Builder().initialData(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       int i = 1; 
       for (Map.Entry entry : map.entrySet()) { 
        Category c = realm.createObject(Category.class, i++); 
        c.setName((String) entry.getKey()); 
        c.setDescription("Category #" + entry.getValue()); 
       } 
      } 
     } 
+0

非常感谢,它的工作原理:) – developer033