VladMorzhanov
9/23/2017 - 2:58 PM

Android LocalDataSource example for repository pattern.

Android LocalDataSource example for repository pattern.

package com.dev.data.source.local;

import com.dev.data.models.User;
import com.dev.data.source.UserDataSource;

import io.realm.Realm;
import io.realm.RealmConfiguration;

/**
 * Concrete implementation of a User's data source as a Realm db.
 */
public class UserLocalDataSource implements UserDataSource {

    private User userObj;
    private Realm realm;

    private final int ID_USER = 0;

    /**realm initialization
     */
    private void startRealm(){
        final RealmConfiguration config = new RealmConfiguration
                .Builder()
                .deleteRealmIfMigrationNeeded()
                .build();
        realm = Realm.getInstance(config);
        userObj = new User();
    }

    /**@param callback - GetuserCallback object
     * @return userObj;
     */
// get user as object if database is not empty
    @Override
    public void getUser(GetUserCallback callback) {
        if (callback != null)
            startRealm();
            userObj = realm.where(User.class)
                    .equalTo("id", ID_USER).findFirst();
        if (userObj == null) {
            realm.commitTransaction();
            callback.onDataNotAvailable(new Error("Data is null"));
        } else {
            realm.commitTransaction();
            callback.onUserLoaded(userObj);
        }
    }

    /** user local saving
     * @param user - object of User.class
     */
    @Override
    public void saveUser(User user) {

        startRealm();
        realm.beginTransaction();
        userObj.setId(ID_USER);
        realm.copyToRealm(user);
        realm.commitTransaction();
    }

    /**
     * user updating in local db
     * @param user - object of User.class
     */
    @Override
    public void updateUser(User user, GetUserCallback callback) {
        startRealm();
        realm.beginTransaction();
        userObj = realm.where(User.class)
                .equalTo("id", ID_USER).findFirst();
        realm.copyToRealmOrUpdate(user);
        realm.commitTransaction();

    }
    
    /** get user ID from local db
     * @return id;
     */
    @Override
    public long getId() {
        final long id;
        startRealm();
        realm.beginTransaction();
        userObj = realm.where(User.class)
                .equalTo("id", ID_USER).findFirst();
        id = userObj.getId();
        realm.commitTransaction();

        return id;
    }
    
    /**
     * get user gender
     * @return gender
     */
    @Override
    public String getGender() {
        final String gender;
        startRealm();
        realm.beginTransaction();
        userObj = realm.where(User.class)
                .equalTo("id", ID_USER).findFirst();
        gender = userObj.getGender();
        realm.commitTransaction();

        return gender;
    }

    /**
     * set user gender
     * @param gender - user`s gender
     */
    @Override
    public void setGender(String gender) {
        startRealm();
        realm.beginTransaction();
        userObj = realm.where(User.class)
                .equalTo("id", ID_USER).findFirst();
        userObj.setGender(gender);
        realm.commitTransaction();
    }
}