12/08/2018, 16:57

GreenDAO ORM database with Reactive RxJava Android

Xin chào tát cả mọi người, hiện tại mình đang tìm hiểu RxJava với GreenDAO, thấy khá hay nên mình muốn chia sẻ cho các bạn cũng như ghi nhớ lại những kiến thức đã học được Về RxJava là gì, để làm gì, các bạn có thể tra cứu trên Google , khá nhiều, mình sẽ không nói trong bài này nữa. Hãy bắt đầu ...

Xin chào tát cả mọi người, hiện tại mình đang tìm hiểu RxJava với GreenDAO, thấy khá hay nên mình muốn chia sẻ cho các bạn cũng như ghi nhớ lại những kiến thức đã học được Về RxJava là gì, để làm gì, các bạn có thể tra cứu trên Google , khá nhiều, mình sẽ không nói trong bài này nữa. Hãy bắt đầu khám phá cơ sở dữ liệu ORD GreenDao để tích hợp với RxJava trong ứng dụng Android. GreenDAO là công cụ ORM nhanh cho Android. GreenDAO cung cấp một giao diện hướng đối tượng với SQLite cơ sở dữ liệu quan hệ vì vậy mà nó rất nhanh và hữu ích cho các lập trình viên Đầu tiên chúng ta hãy xem các thành phần cơ bản của GreenDAO:

  1. DaoMaster: DaoMaster giữ đối tượng cơ sở dữ liệu (SQLiteDatabase) và quản lý các lớp DAO (không phải đối tượng) cho một giản đồ cụ thể. Nó có phương pháp tĩnh để tạo ra các bảng hoặc xóa chúng. Các lớp bên trong của OpenHelper và DevOpenHelper là các triển khai SQLiteOpenHelper tạo ra lược đồ trong cơ sở dữ liệu SQLite
  2. DaoSession: Quản lý tất cả các đối tượng DAO có sẵn cho một giản đồ cụ thể, mà bạn có thể thu được bằng cách sử dụng một trong những phương pháp getter. DaoSession cung cấp một số phương pháp tồn tại chung chung như insert, load, update, refresh và delete cho các thực thể .
  3. DAOs: Đối với mỗi GreenDAO sẽ được tạo ta 1 DAO. Nó có nhiều các method nhứ count,loadAll hay insertInTx.
  4. Entities: Là một thực thể được tạo ra trong quá trình sử dụng, lưu trữ các giá trị của đối tượng đó. Như một class POJO

Tích hợp GreenDAO vào trong app

Vì chúng ta kết hợp với RXJava nên cần thêm cả thư viện RxJava vào.

 compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
 compile 'io.reactivex.rxjava2:rxjava:2.0.8'
 compile 'org.greenrobot:greendao:3.2.0'
 compile 'org.greenrobot:greendao-generator:3.2.0'
 compile 'net.zetetic:android-database-sqlcipher:3.5.1'
 apply plugin: 'org.greenrobot.greendao'

Tạo GreenDAO database

public class GreenDaoDatabase {
 
private static DaoSession mDaoSession;
public static final boolean ENCRYPTED = true;

private GreenDaoDatabase() {
}

private static class SingletonHolder {
    private static final GreenDaoDatabase INSTANCE = new GreenDaoDatabase();
}

public static GreenDaoDatabase getInstance() {
    return SingletonHolder.INSTANCE;
}

public void init(Context context) {
    init(context, "db");
}

public void init(@NonNull Context context, @NonNull String dbName) {
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context.getApplicationContext(), ENCRYPTED ? "notes-db-encrypted" : "articles-db");
    Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
    mDaoSession = new DaoMaster(db).newSession();
}

public DaoSession getDaoSession() {
    if (null == mDaoSession) {
        throw new NullPointerException("green db has not been initialized");
    }
    return mDaoSession;
}
}

OK, đã sẵn sàng, việc còn lại là cần gọi trong Activity chứa nó GreenDaoDatabase.getInstance().init(this);

Làm việc với GreenDAO

Đầu tiên, tôi tạo ra một interface để định nghĩa các phương thức sẽ thực hiện:

public interface KickStarterSource {
    Flowable<List<KickStarter>> getKickStarters();
    Observable<KickStarter> getKickStarterById(long rowId);
    void saveKickStarter(@NonNull KickStarter kickStarter);
    long getKickStartCount();

ok, giờ kết hợp với GreenDAO

public class KickStarterLocalSource implements KickStarterSource{
 
    private final  static String TAG = KickStarterLocalSource.class.getSimpleName();
 
     private KickStarterDao getKickStarterDao() {
        Timber.d(TAG, "getArticleDao()", Thread.currentThread().getName(), Thread.currentThread().getId());
        return GreenDaoDatabase.getInstance().getDaoSession().getKickStarterDao();
    }
    @Override
    public Flowable<List<KickStarter>> getKickStarters() {
        return Flowable.fromCallable(new Callable<List<KickStarter>>() {
            @Override
            public List<KickStarter> call() throws Exception {
                Timber.d(TAG, "getKickStarters()", Thread.currentThread().getName(), Thread.currentThread().getId());
                List<KickStarter> list = getKickStarterDao().loadAll();
                Timber.d("getKickStarters: " + list.size());
                return list;
            }
        });
    }
 
    @Override
    public Observable<KickStarter> getKickStarterById(final long rowId) {
        return Observable.fromCallable(new Callable<KickStarter>() {
            @Override
            public KickStarter call() throws Exception {
                Timber.d(TAG, "getKickStarterById()", Thread.currentThread().getName(), Thread.currentThread().getId());
                KickStarter kickStarter = getKickStarterDao().load(rowId);
                return kickStarter;
            }
 
        });
    }
 
    @Override
    public void saveKickStarter(@NonNull KickStarter kickStarter) {
        Timber.d(TAG, "saveKickStarter()", Thread.currentThread().getName(), Thread.currentThread().getId());
        getKickStarterDao().insertOrReplace(kickStarter);
 
    }
}

Và bây giờ gọi phương thức thực hiện

private void loadFromDb(){
        Flowable<List<KickStarter>> listFlowable = mKickStarterLocalDataSource.getKickStarters();
        listFlowable.doOnSubscribe(new Consumer<Subscription>() {
            @Override
            public void accept(@io.reactivex.annotations.NonNull Subscription subscription) throws Exception {
 
            }
        }).subscribe(new Consumer<List<KickStarter>>() {
            @Override
            public void accept(@io.reactivex.annotations.NonNull List<KickStarter> kickStarters) throws Exception {
                mKickStartView.onKickStartersOk(kickStarters);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
                Preconditions.checkNotNull(throwable);
                mKickStartView.showLoadErrorMessage(throwable.getMessage());
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                // mKickStartView.onLoadFinish();
            }
        });
    }

Và kết quả : Bạn có thể tải code tại :https://github.com/sunil676/MVPAndroid Bài viết được tham khảo tại : http://mobologicplus.com/exploring-greendao-orm-database-reactive-rxjava-android/

0