2016-08-24 22 views
0

私はGITHUBでここに尋ねるのを見ました..レルムデータベース、crudを使用できますか?

古いSQLIteは、データベース操作を行うためのCRUDサービスを作成するために使用されました。私はrealm.close();

を呼び出すために忘れてはならないので、私は、少なくとも4つのactivites、10個の断片、10の非同期タスクや他のものを持っている、と私はrealm.close

を呼び出す必要がある場合は、各1は、データベース操作の種類を持っています私は、CRUDを作成し、realmを渡し、操作を行うために使用する必要がありますか?完全

static LOperations instance; 
private Realm realm; 
private RealmQuery<L> query; 
private RealmResults<Category> categories; 
private L lObject; 

public LOperations(Application application) { 
    realm = Realm.getDefaultInstance(); 
} 


public static LOperations with(Activity activity) { 
    if (instance == null) { 
     instance = new LOperations(activity.getApplication()); 
    } 
    return instance; 
} 

public static LOperations with(Application application) { 

    if (instance == null) { 
     instance = new LOperations(application); 
    } 
    return instance; 
} 

public static LOperations with(Fragment fragment) { 
    if (instance == null) { 
     instance = new LOperations(fragment.getActivity().getApplication()); 
    } 
    return instance; 
} 

@Override 
public RealmResults<Lei> getAllLbyCategory(String c) { 
    query = realm.where(L.class); 
    query.equalTo("active", 1); 
    query.contains("category", c); 
    return query.findAllSorted("id", Sort.ASCENDING); 

} 

@Override 
public RealmResults<Category> getAllCategories() { 
    return realm.where(Category.class).equalTo("active", true).findAllSorted("order", Sort.ASCENDING); 
} 

@Override 
public RealmResults<Lei> getAllActiveL() { 

    query = realm.where(L.class); 
    query.equalTo("active", 1); 
    return query.findAllSorted("last_date", Sort.ASCENDING); 

} 

この作品を、しかし、私は開かれたデータベースを追跡できる方法を理解カント:

私の実際のコードは次のようになり?

実際に私はこれを使用する:LOperations.with(this/getActivity).someMethod();(これを行うことで、私は開かれたレルムを追跡カントと思う)

私はこのことについて何かで考えることができます。

Realm realm = realm.getDefaultInstance(); 

and to get allActiveL(), change to: 

    @Override 
    public RealmResults<Lei> getAllActiveL(Realm realm) { 

     realm.where(L.class); 
     query.equalTo("active", 1); 
     return query.findAllSorted("last_date", Sort.ASCENDING); 

    } 

ので、私は、レルムが、その後に作成され、持っていますメソッドに渡すので、私はonDestroyでrealm.close()を追加することができます

は正しいアプローチですか?または別のものがありますか?

答えて

0

現在お使いのLOperationsだけあなたが最初にインスタンスを作成したスレッド上で動作しますし、それが他のスレッド上で動作しないでしょう(それはdoInBackground()で破るがちです)

現在、私のリポジトリすべてが持っていますRealmのパラメータで、シングルトンです。別の方法として、必要なときにリポジトリを作成し、インスタンスが作成時に渡されます(インスタンスはスレッドの実行時に閉じられます)。個人的に

public interface RealmRepository<T extends RealmObject, ID> { 
    String getIdFieldName(); 

    T findOne(Realm realm, ID id); 

    RealmResults<T> findAll(Realm realm); 

    T saveOrUpdate(Realm realm, T t); 

    RealmList<T> saveOrUpdate(Realm realm, RealmList<T> tList); 

    RealmQuery<T> query(Realm realm); 

    void delete(Realm realm, ID id); 

    void delete(Realm realm, T t); 

    void deleteAll(Realm realm, RealmResults<T> realmResults); 

    void deleteEveryObject(Realm realm); 

    long count(Realm realm); 
} 

私はsingle Realm for the UI threadを使用し、閉じるには、最終的にバックグラウンドスレッドのレルムのインスタンスを作成します。通常のフラグメントのための

しかし、一般的に、onCreate()と活動のためのonDestroy()仕事、onCreateView()onDestroyView()は、個人的に私はconstructor and onDestroy() for retained fragmentsを行います。

そして、非同期タスクの

public void MyAsyncTask extends AsyncTask<Void, Void, Void> { 
    public Void doInBackground(Void... nothing) { 
     Realm realm = null; 
     try { 
      realm = Realm.getDefaultInstance(); 
      //... 
     } finally { 
      if(realm != null) { 
       realm.close(); 
      } 
     } 
    } 

    @Override 
    public void onPreExecute() { 
     // use realm on UI thread 
    } 

    @Override 
    public void onPostExecute(Void results) { 
     // use realm on UI thread    
    } 
} 
関連する問題