我们开始在
Android应用程序项目中使用Realm.io.但是我们不喜欢Realm.io API的一点是没有任何异步方式来查询数据库.在旧项目中我们使用DbQuery和sqlite,因此我们习惯在线程或AsyncTask中进行数据库查询.但令人非常不安的是,在所有示例中,查询都是在UiThread中进行的.对于应用程序性能来说这不是一件坏事吗?我们尝试在线程或AsyncTasks中进行查询,但是当我们在UiThread中访问我们的模型对象时,我们得到一个错误,说我们无法在查询它们的线程中访问RealObjects.这是我们的示例代码:
service.getDatabaseHelper() .with(getActivity()) //Context that I use to instance the Realm instance .onFinishQuery( new DatabaseHelper.IQueryGetCallback<UserRealm>() { @Override public void onGetResult(UserRealm[] results) { for(UserRealm aUser : results){ //Here is where it crashes Log.d("Log","Username -> "+aUser.getName()); } } }) .getUsersFromDb(); //....... //In our "DAO" class public void getUsersFromDb(){ new GetQueryTask() { @Override public UserRealm[] onQueryReadyToBeExecuted(Realm realmInstance) { RealmQuery<UserRealm> query = realmInstance.where(UserRealm.class); RealmResults<UserRealm> result = query.findAll(); // TODO hacer que devuelva un array ArrayList<UserRealm> users = new ArrayList<UserRealm>(); for (UserRealm u : result) { //Here we can read the RealObject's fine users.add(u); } return users.toArray(new UserRealm[users.size()]); } }.execute(); } //Our abstract task that wraps all the instantiation-transaction behavIoUr public abstract class GetQueryTask<T extends RealmObject> extends AsyncTask<Void,Void,T[]> { @Override protected T[] doInBackground(Void... params) { //We tried to instantiate this class in several places,here //Send it as parameter through the AsyncTask //context is set in the with(Context ctx) method. Realm realm = Realm.getInstance(context); return onQueryReadyToBeExecuted(realm); } public abstract T[] onQueryReadyToBeExecuted(Realm realmInstance); @Override protected void onPostExecute(T[] result) { mCallback.onExecute(result); } }
我们主要担心的不是这段代码的“bug”,而是可以像在Realm.io开发人员的示例中那样在UiThread中进行查询.如果是这种情况,那么异步执行查询的所有代码将不再是必需的.