简体   繁体   English

数据未存储到领域数据库中

[英]Data not stored into realm database

java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper and you provided a callback, we need a Handler to invoke your callback java.lang.IllegalStateException:您的领域是从没有Looper的线程打开的,并且您提供了回调,我们需要一个Handler来调用您的回调

I'm Writing a code that will do in background- read from a text file(inside assets) and then placing them into a realm database.But i seem to get this error 我正在写一个将在后台执行的代码-从文本文件(内部资产)中读取,然后将它们放入领域数据库中。但是我似乎收到此错误

"java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper and you provided a callback, we need a Handler to invoke your callback" “ java.lang.IllegalStateException:您的领域是从没有Looper的线程打开的,并且您提供了回调,我们需要一个Handler来调用您的回调”

In my onCreate i have this 在我的onCreate我有这个

    Realm.init(context);
    realm = Realm.getDefaultInstance();

    ParseInBackground task = new ParseInBackground();
    task.execute();

and in the do-in-background task of AsyncTask i got this 在AsyncTask的后台执行任务中,我得到了这个

try {
            realm = Realm.getDefaultInstance();
            realm.executeTransactionAsync(new Realm.Transaction() {
                                              @Override
                                              public void execute(Realm bgRealm) {

                                                  final ModelClass modelClass = bgRealm.createObject(ModelClass.class);
                                                  try {
                                                      InputStream file = getAssets().open("goodie.txt");
                                                      reader = new BufferedReader(new InputStreamReader(file));
                                                      final String[] line = {reader.readLine()};
                                                      while (line[0] != null) {
                                                          handler.post(new Runnable() {
                                                              @Override
                                                              public void run() {
                                                                  try {
                                                                      line[0] = reader.readLine();
                                                                  } catch (IOException e) {
                                                                      e.printStackTrace();
                                                                  }
                                                                  String[] namelist = line[0].split(":");
                                                                  String iWord = namelist[0];
                                                                  String iDesc = namelist[1];
                                                                  modelClass.setName(iWord);
                                                                  modelClass.setDesc(iDesc);
                                                                  count++;

                                                              }
                                                          });

                                                      }
                                                  } catch (IOException e) {
                                                      e.printStackTrace();
                                                  } finally {
                                                      if (realm != null)
                                                          realm.close();
                                                  }
                                              }

                                          }, new Realm.Transaction.OnSuccess() {
                                              @Override
                                              public void onSuccess() {
                                                  Toast.makeText(MainActivity.this, "Added " + count + "items", Toast.LENGTH_SHORT).show();
                                              }
                                          }, new Realm.Transaction.OnError() {

                                              @Override
                                              public void onError(Throwable error) {


                                              }
                                          }
            );
        } catch (Exception e) {
            e.printStackTrace();
        }

and a Model class called ModelClass has this 而名为ModelClass的Model类具有此

private String name;
private String desc;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

Desperately in need of help.Thanks in advance 迫切需要帮助。

Check http://developer.android.com/reference/android/os/Handler.html and http://developer.android.com/reference/android/os/Looper.html 检查http://developer.android.com/reference/android/os/Handler.htmlhttp://developer.android.com/reference/android/os/Looper.html

Basically Realm need a way to communicate with your thread when doing asyc query, on Android, naturally Looper and Handler is the way to go. 基本上,Realm在进行asyc查询时需要一种与线程进行通信的方式,在Android上,自然地,Looper和Handler是可行的方式。

Check this for more sample code. 检查更多示例代码。 https://github.com/realm/realm-java/tree/master/examples/threadExample https://github.com/realm/realm-java/tree/master/examples/threadExample

You need to remove Handler.post(...) from within the execute callback. 您需要从execute回调中删除Handler.post(...)

realm.executeTransactionAsync(new Realm.Transaction() {
                                          @Override
                                          public void execute(Realm bgRealm) {

                                              final ModelClass modelClass = bgRealm.createObject(ModelClass.class);
                                              try {
                                                  InputStream file = getAssets().open("goodie.txt");
                                                  reader = new BufferedReader(new InputStreamReader(file));
                                                  final String[] line = {reader.readLine()};
                                                  while (line[0] != null) {
                                                              try {
                                                                  line[0] = reader.readLine();
                                                              } catch (IOException e) {
                                                                  e.printStackTrace();
                                                              }
                                                              String[] namelist = line[0].split(":");
                                                              String iWord = namelist[0];
                                                              String iDesc = namelist[1];
                                                              modelClass.setName(iWord);
                                                              modelClass.setDesc(iDesc);
                                                              count++;

                                                  }
                                              } catch (IOException e) {
                                                  e.printStackTrace();
                                              } finally {
                                                  if (realm != null)
                                                      realm.close();
                                              }
                                          }

                                      }, new Realm.Transaction.OnSuccess() {
                                          @Override
                                          public void onSuccess() {
                                              Toast.makeText(MainActivity.this, "Added " + count + "items", Toast.LENGTH_SHORT).show();
                                          }
                                      }, new Realm.Transaction.OnError() {

                                          @Override
                                          public void onError(Throwable error) {


                                          }
                                      }
        );
    } catch (Exception e) {
        e.printStackTrace();
    }

I hope this helps. 我希望这有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM