尝试执行事务异步时,它会在Realm中返回错误

时间:2016-07-01 10:24:25

标签: android realm

当尝试执行事务处理异步时,它会返回错误,例如'MODEL = Method threw'java.lang.IllegalStateException'exception。无法评估io.realm.ModelRealmProxy.toString()'。此外,当我提取并调试它时,它会显示类似于图像

的数据
public class AsyncTaskExample extends AppCompatActivity {

List<Student> mStudentCount;

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

    mStudentCount = new ArrayList<>();
    ((Button) findViewById(R.id.insert_10)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new AsyncTask<Void, Void, Void>() {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected Void doInBackground(Void... params) {
                    final Realm mRealm = Realm.getDefaultInstance();
                    try{
                        Log.i(getClass().getSimpleName(), "----------------------------before start :: " +
                                mRealm.where(Student.class).findAll().size());

                        mRealm.executeTransaction(
                                new Realm.Transaction() {
                                    @Override
                                    public void execute(Realm realm) {
                                        for(int i=0;i<10;i++){
                                            Log.i(getClass().getSimpleName(), "----------------------------inserting data");
                                            String s = Utils.randomAlphaNumeric(8);
                                            Log.i(getClass().getSimpleName(), "------------------------name : " + s);

                                            Student student = realm.createObject(Student.class);
                                            student.setRollNo(String.valueOf(AppClass.ROLL_NO++));
                                            student.setName(s);
                                            mStudentCount.add(student);
                                        }
                                        realm.copyToRealmOrUpdate(mStudentCount);

                                    }
                                }
                        );
                    }
                    catch (Exception e){
                        System.out.println(e.toString());;
                    }
                    finally {
                        mRealm.close();
                    }


                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    super.onPostExecute(aVoid);
                    Log.i(getClass().getSimpleName(), "----------------------------after success :: " +
                            RealmHClass.getRealm().where(Student.class).findAll().size());

                }
            }.execute();
        }
    });

    ((Button) findViewById(R.id.read_in_async)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new AsyncTask<Void, Integer, List<Student>>() {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();

                }

                @Override
                protected List<Student> doInBackground(Void... params) {
                    Realm mRealm = Realm.getDefaultInstance();
                    Integer i = Integer.valueOf(0);
                    try{
                        RealmList<Student> s = new RealmList<Student>();
                        mStudentCount.addAll(mRealm.where(Student.class).findAll());
                    }
                    catch (Exception e){
                    }
                    finally {
                        mRealm.close();
                    }
                    return mStudentCount;

                }

                @Override
                protected void onPostExecute(List<Student> integer) {
                    super.onPostExecute(integer);
                    Toast.makeText(AsyncTaskExample.this, "Total data : " + integer.size(), Toast.LENGTH_LONG).show();
                }
            }.execute();
        }
    });
}

}

public class Student extends RealmObject {

@PrimaryKey
String rollNo;
String name;


public Student() {

}

public String getRollNo() {
    return rollNo;
}

public void setRollNo(String rollNo) {
    this.rollNo = rollNo;
}

public String getName() {
    return name;
}

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

@Override
public String toString() {
    return "Student{" +
            "rollNo='" + rollNo + '\'' +
            ", name='" + name + '\'' +
            '}';
}

}

public class AppClass extends Application {
public static RealmConfiguration realmConfig;
public static AppClass instance;
public static int ROLL_NO;
@Override
public void onCreate() {
    super.onCreate();
    instance = this;
    ROLL_NO =0;
    realmConfig = new RealmConfiguration.Builder(this)
            .build();
    Realm.setDefaultConfiguration(realmConfig);
}
public static void deleteRealmDatabase(){
    Log.i("AppClass","delete realm file : " + Realm.deleteRealm(realmConfig));
}
public static AppClass getInstance() {
    return instance;
}

}

public class Utils {
private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

public static String randomAlphaNumeric(int count) {
    StringBuilder builder = new StringBuilder();
    while (count-- != 0) {
        int character = (int) (Math.random() * ALPHA_NUMERIC_STRING.length());
        builder.append(ALPHA_NUMERIC_STRING.charAt(character));
    }
    return builder.toString();
}

}

Error in debugging as in image

1 个答案:

答案 0 :(得分:0)

我得到了同样的错误。从我在代码中看到的内容,我的RealmObject中也有toString()。所以我去除了它,这解决了问题。这是一个快速解决方案,因为该方法导致了问题。