2016-05-06 5 views
0

でAsyncTaskの実装:私はレルムにアプリケーションを移行していると私は私がオブジェクトのリストを検索し、検索クエリに基づいて、それをフィルタリングするために使用(簡潔にするために簡略化)は、このようなAsyncTask持つレルム

private class SearchTask extends AsyncTask<String, Void> { 

Realm realm; 

@Override 
protected List<SearchResults> doInBackground(String... params) { 

    String searchString = params[0]; 
    realm = Realm.getDefaultInstance(); 
    ArrayList<SearchResults> myFoos = FooHelper.getAllFoo(realm); 
    ArrayList<Foo> matches = new ArrayList<>(); 

    for (Foo aFoo : myFoos){ 
     if(!aFoo.getProperty().isEmpty()){ 
     matches.add(aFoo); 
     } 
    } 

    realm.close(); 
    return matches; 
} 

@Override 
protected void onPostExecute(List<SearchResults> results) { 
    super.onPostExecute(results); 

    synchronized (SearchActivity.this){ 
     //use search results 
    } 
} 

}

問題は、結果が返される場合、それらは別のスレッド上で作成されたので、彼らはアクセスできないことです。私が考えることができる唯一の解決策は、非同期タスクからプライマリキーの配列を返し、それらのキーを再度クエリすることです。

基本的にはレルムでSEARCHを実行するより良い方法が必要です。助言がありますか?

答えて

0

非常に最近まで、レルムは非同期クエリをまったくサポートしていませんでした。

これは変更されていますが、非同期タスクでは行いません。相続人はそれを行う方法についてのドキュメント:私はクエリを使用してい

https://realm.io/docs/java/latest/#asynchronous-queries

+0

興味深い...一つの問題は、私は、姓と名と連絡先の配列を持っていると私は上で検索したいということですフルネーム(これはRealmObjectのプロパティではありません)。 私のAsyncTaskでは、最初と最後の「First Last」のような別の文字列に最初に参加しました。「First L」のようなクエリで一致するようになりました。 "Realm"という方法で、fullNameという名前のオブジェクトに新しい変数を作成するだけですか?過剰な殺人のようだ。 –

関連する問題