2016-12-02 6 views
0

У меня есть это исключение, когда я запускаю свое приложение. Как я могу это исправить?Realm уже в транзакции записи в/Users/cm/Realm/

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: theo.testing.realmapplication, PID: 3359 
       java.lang.RuntimeException: Unable to start activity ComponentInfo{theo.testing.realmapplication/theo.testing.realmapplication.MainActivity}: java.lang.IllegalStateException: The Realm is already in a write transaction in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 113 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
       Caused by: java.lang.IllegalStateException: The Realm is already in a write transaction in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 113 
        at io.realm.internal.SharedRealm.nativeBeginTransaction(Native Method) 
        at io.realm.internal.SharedRealm.beginTransaction(SharedRealm.java:219) 
        at io.realm.BaseRealm.beginTransaction(BaseRealm.java:328) 
        at io.realm.Realm.beginTransaction(Realm.java:125) 
        at theo.testing.realmapplication.MainFragment$1.execute(MainFragment.java:47) 
        at io.realm.Realm.executeTransaction(Realm.java:1253) 
        at theo.testing.realmapplication.MainFragment.onActivityCreated(MainFragment.java:43) 
        at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133) 
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) 
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) 
        at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:604) 
        at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178) 
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237) 
        at android.app.Activity.performStart(Activity.java:6253) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
        at android.app.ActivityThread.-wrap11(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:148)  
        at android.app.ActivityThread.main(ActivityThread.java:5417)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

И мой код

public class RealmExampleApplication extends Application { 

@Override 
public void onCreate() { 
    super.onCreate(); 

    Realm.init(this); 


    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder() 
      .name("examples.db") 
      .build(); 

    Realm.setDefaultConfiguration(realmConfiguration); 
    } 


} 

И я ставлю так фиктивные данные внутри моего основного фрагмента.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    realm = Realm.getDefaultInstance(); 

    realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      //create task 
      realm.beginTransaction(); 

      Task t = realm.createObject(Task.class); 
      t.setId(UUID.randomUUID().toString()); 
      t.setTitle("Hello"); 
      t.setDescription("This is description"); 

      realm.beginTransaction(); 
     } 
    }); 

    RealmResults<Task> tasks = realm.where(Task.class).findAll(); 

    for(Task t:tasks){ 
     Log.d("Realm",t.getTitle()); 
    } 
} 

Все, что я хочу сейчас, чтобы отобразить название, а потом попробовать что-то новое, как и многие-ко-многим и т.д.

Спасибо,

Тео.

UPDATE

Я делаю операцию записи в фоновом потоке.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    Handler handler = new Handler(); 

    final Runnable r = new Runnable() { 
     public void run() { 
      realm = Realm.getDefaultInstance(); 

      realm.executeTransaction(new Realm.Transaction() { // TODO: move write to background thread 
       @Override 
       public void execute(Realm realm) { 
        //create task 

        Task t = realm.createObject(Task.class, UUID.randomUUID().toString()); // FIXME: if this doesn't work, `id` is not annotated with `@PrimaryKey` 
        t.setTitle("Hello"); 
        t.setDescription("This is description"); 
       } 
      }); 

      RealmResults<Task> tasks = realm.where(Task.class).findAll(); 

      for(Task task : tasks) { 
       Log.d("Realm", task.getTitle()); 
      } 

     } 
     }; 

      handler.postDelayed(r, 1000); 


    } 

Но теперь у меня есть это исключение.

12-02 08:35:10.686 1129-1484/? E/Drm: Failed to find drm plugin 
+0

Вложенные транзакции не поддерживаются, поэтому открытие транзакции 3 раза подряд обычно не работает. – EpicPandaForce

+0

Вы должны рассмотреть возможность закрытия экземпляра Realm в фоновом потоке, когда вы закончите с ним – EpicPandaForce

ответ

1

Это не работает, потому что вы открываете новую транзакцию внутри транзакции. Дважды.

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    realm = Realm.getDefaultInstance(); 

    realm.executeTransaction(new Realm.Transaction() { // TODO: move write to background thread 
     @Override 
     public void execute(Realm realm) { 
      //create task 

      Task t = realm.createObject(Task.class, UUID.randomUUID().toString()); // FIXME: if this doesn't work, `id` is not annotated with `@PrimaryKey` 
      t.setTitle("Hello"); 
      t.setDescription("This is description"); 
     } 
    }); 

    RealmResults<Task> tasks = realm.where(Task.class).findAll(); 

    for(Task task : tasks) { 
     Log.d("Realm", task.getTitle()); 
    } 
} 
+0

, пожалуйста, проверьте мое обновление. – Theo

+0

Это не связано с Realm, так что это совершенно другая проблема. – EpicPandaForce

+1

альтернативно, вы можете использовать realm.isInTransaction(), чтобы проверить, находится ли область в транзакции перед выполнением. –

Смежные вопросы