2017-04-26 15 views
2

私はCRUD操作のDBManagerクラスを持っており、アプリケーション全体で使用したいと思っていますが、Realmオブジェクトは作成されたスレッドでしかアクセスできないため、スレッド内のDBManagerクラスメソッドなど...すべてのスレッドでレルムを使用

私が望むのは、DBManager内で宣言されたupdateUploadingFileStatusメソッドを、サービス内で実行されているスレッドから呼び出すことです。

これは別のスレッドからこのメソッドを呼び出すと、私のDBManagerのクラス

object DbManager { 
private val realm: Realm by lazy { Realm.getDefaultInstance() } 

fun saveOrRemoveUploadFile(filePath: String, save: Boolean){ 
    val model = getUploadModelByFilePath(filePath) 
    realm.executeTransaction { 
     model.markedForUpload = save 
     realm.insertOrUpdate(model) 
    } 
} 

fun updateUploadingFileStatus(filePath: String, uploaded: Boolean){ 
    val model = getUploadModelByFilePath(filePath) 
    realm.executeTransaction { 
     model.uploadedStatus = uploaded 
    } 
} 

fun getFilesForUpload() : List<UploadModel> { 
    return realm 
      .where(UploadModel::class.java) 
      .equalTo("markedForUpload",true) 
      .equalTo("uploadedStatus",false) 
      .findAll() 
} 

fun getUploadModelByFilePath(filePath: String) : UploadModel { 
    return realm.where(UploadModel::class.java).equalTo("filePath",filePath).findFirst() ?: UploadModel(filePath) 
} 

} 

で、この問題を解決することができますどのようにjava.lang.IllegalStateException Realm access from incorrect thread.スロー?そんなことをするための良いスタイルは何ですか?

+0

あなたのDbManagerはシングルトンでなければならないことを知っていますので、各スレッドで同じレルムにアクセスする必要があります –

+0

これはすでにシングルトンです –

+0

だからグローバルシングルトンの場合、レルム? – EpicPandaForce

答えて

0
は、次のようにあなたの関数のコードを変更し

public void updateUploadingFileStatus(final String filePath, final Boolean uploaded) { 
     mRealm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       UploadModel model = getUploadModelByFilePath(filePath); 
       model.uploadedStatus = uploaded; 
      } 
     }); 
    } 

時間前、私は新しいトランザクションを使用することによって、この問題を解決しました。また、RealmDBにアクセスするためにSingletonクラスを使用していて、この関数をネットワークからの応答ハンドラ内で呼び出していました。これはうまくいくはずです。

+0

ありがとうございますが、あなたのトランザクションが非同期であることを除いて、コードと私の間に違いはありません –

+0

realm.executeTransaction()関数内で新しいトランザクションを暗黙的に使用していますか? P.s .: Javaタグを使用しましたが、それはjavaではありません。 –

+0

はい、すべて同じですので、それはKotlin –

関連する問題