Skip to content

Instantly share code, notes, and snippets.

@carloseduardosx
Last active January 18, 2021 05:36
Show Gist options
  • Select an option

  • Save carloseduardosx/6c3a3dfc3a9cb467aa464884f39544c2 to your computer and use it in GitHub Desktop.

Select an option

Save carloseduardosx/6c3a3dfc3a9cb467aa464884f39544c2 to your computer and use it in GitHub Desktop.

Revisions

  1. carloseduardosx revised this gist May 15, 2017. 2 changed files with 2 additions and 2 deletions.
    2 changes: 1 addition & 1 deletion CustomApplication.java
    Original file line number Diff line number Diff line change
    @@ -20,7 +20,7 @@ public void onCreate() {

    application = this;

    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
    .deleteRealmIfMigrationNeeded()
    .build();
    Realm.setDefaultConfiguration(realmConfiguration);
    2 changes: 1 addition & 1 deletion RealmAutoIncrement.java
    Original file line number Diff line number Diff line change
    @@ -123,7 +123,7 @@ private Realm getRealm() {
    private RealmConfiguration getRealmConfiguration() {

    //TODO Change for your current RealmConfiguration
    return new RealmConfiguration.Builder(CustomApplication.getContext())
    return new RealmConfiguration.Builder()
    .deleteRealmIfMigrationNeeded()
    .build();
    }
  2. carloseduardosx revised this gist Sep 9, 2016. 1 changed file with 16 additions and 8 deletions.
    24 changes: 16 additions & 8 deletions RealmAutoIncrement.java
    Original file line number Diff line number Diff line change
    @@ -51,17 +51,25 @@ public Integer getNextIdFromModel(Class<? extends RealmObject> clazz) {

    private Integer updateIdByClassName(final Class<? extends RealmObject> clazz) {

    final AutoIncrementEntity autoIncrementEntity = getRealm().where(AutoIncrementEntity.class).findFirst();
    Realm realm = getRealm();
    final AutoIncrementEntity autoIncrementEntity = realm.where(AutoIncrementEntity.class).findFirst();

    getRealm().executeTransaction(new Realm.Transaction() {
    if (realm.isInTransaction()) {

    @Override
    public void execute(Realm realm) {
    autoIncrementEntity.incrementByClassName(clazz.getSimpleName());
    realm.copyToRealmOrUpdate(autoIncrementEntity);
    } else {

    autoIncrementEntity.incrementByClassName(clazz.getSimpleName());
    realm.copyToRealmOrUpdate(autoIncrementEntity);
    }
    });
    realm.executeTransaction(new Realm.Transaction() {

    @Override
    public void execute(Realm realm) {

    autoIncrementEntity.incrementByClassName(clazz.getSimpleName());
    realm.copyToRealmOrUpdate(autoIncrementEntity);
    }
    });
    }
    return autoIncrementEntity.findByClassName(clazz.getSimpleName());
    }

  3. carloseduardosx revised this gist Sep 7, 2016. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions RealmAutoIncrement.java
    Original file line number Diff line number Diff line change
    @@ -114,6 +114,7 @@ private Realm getRealm() {
    @NonNull
    private RealmConfiguration getRealmConfiguration() {

    //TODO Change for your current RealmConfiguration
    return new RealmConfiguration.Builder(CustomApplication.getContext())
    .deleteRealmIfMigrationNeeded()
    .build();
  4. carloseduardosx revised this gist Sep 3, 2016. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions UnknownModelException.java
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,9 @@
    package com.carloseduardo.exception;

    /**
    * @author Carlos Eduardo
    * @since 03/09/2016
    */
    public class UnknownModelException extends RuntimeException {

    public UnknownModelException() {
  5. carloseduardosx created this gist Sep 3, 2016.
    92 changes: 92 additions & 0 deletions AutoIncrementEntity.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,92 @@
    package com.carloseduardo.model;

    import com.carloseduardo.constants.KnownClasses;
    import com.carloseduardo.exception.UnknownModelException;

    import io.realm.RealmObject;
    import io.realm.annotations.PrimaryKey;
    import io.realm.annotations.Required;

    /**
    * @author Carlos Eduardo
    * @since 03/09/2016
    */
    public class AutoIncrementEntity extends RealmObject {

    @Required
    @PrimaryKey
    private Integer _id = 1;

    private Integer accountType;

    private Integer equipment;

    private Integer location;

    public Integer getId() {
    return _id;
    }

    public Integer getAccountType() {
    return accountType;
    }

    public void setAccountType(Integer accountType) {
    this.accountType = accountType;
    }

    public Integer getEquipment() {
    return equipment;
    }

    public void setEquipment(Integer equipment) {
    this.equipment = equipment;
    }

    public Integer getLocation() {
    return location;
    }

    public void setLocation(Integer location) {
    this.location = location;
    }

    public void incrementByClassName(String className) {

    switch (className) {

    case KnownClasses.ACCOUNT_TYPE:
    accountType = accountType == null ? 1 : ++accountType;
    break;

    case KnownClasses.EQUIPMENT:
    equipment = equipment == null ? 1 : ++equipment;
    break;

    case KnownClasses.LOCATION:
    location = location == null ? 1 : ++location;
    break;

    default:
    throw new UnknownModelException("Class name: " + className);
    }
    }

    public Integer findByClassName(String className) {

    switch (className) {

    case KnownClasses.ACCOUNT_TYPE:
    return this.accountType;

    case KnownClasses.EQUIPMENT:
    return this.equipment;

    case KnownClasses.LOCATION:
    return this.location;

    default:
    throw new UnknownModelException("Class name: " + className);
    }
    }
    }
    38 changes: 38 additions & 0 deletions CustomApplication.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    package com.carloseduardo.application;

    import android.app.Application;
    import android.content.Context;

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

    /**
    * @author Carlos Eduardo
    * @since 03/09/2016
    */
    public class CustomApplication extends Application {

    private static CustomApplication application;

    @Override
    public void onCreate() {
    super.onCreate();

    application = this;

    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
    .deleteRealmIfMigrationNeeded()
    .build();
    Realm.setDefaultConfiguration(realmConfiguration);
    }

    public static CustomApplication getApplication() {

    return application;
    }

    public static Context getContext() {

    return application;
    }
    }
    12 changes: 12 additions & 0 deletions KnownClasses.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,12 @@
    package com.carloseduardo.constants;

    /**
    * @author Carlos Eduardo
    * @since 03/09/2016
    */
    public interface KnownClasses {

    String ACCOUNT_TYPE = "AccountType";
    String EQUIPMENT = "Equipment";
    String LOCATION = "Location";
    }
    130 changes: 130 additions & 0 deletions RealmAutoIncrement.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,130 @@
    package com.carloseduardo.database;

    import android.support.annotation.NonNull;
    import android.util.Log;

    import com.carloseduardo.application.CustomApplication;
    import com.carloseduardo.model.AutoIncrementEntity;

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

    /**
    * Simple implementation of Auto Increment feature for Realm
    *
    * RealmAutoIncrement is a singleton which maintain the last id saved from each model.
    * <p/>
    * To get next id from anyone model, simple call the method getNextIdFromModel.
    *
    * @see #getNextIdFromModel(Class)
    *
    * @author Carlos Eduardo
    * @since 03/09/2016
    */
    public final class RealmAutoIncrement {

    private static RealmAutoIncrement autoIncrementMap;

    private RealmAutoIncrement() {

    createAutoIncrementEntityIfNotExist();
    }

    /**
    * Search in AutoIncrementEntity for the last saved id from model passed and return the next one
    *
    * @param clazz Model which should get the next id
    * @return The next id which can be saved in database
    */
    public Integer getNextIdFromModel(Class<? extends RealmObject> clazz) {

    if (isValidMethodCall()) {

    Integer id = updateIdByClassName(clazz);
    Log.i("RealmAutoIncrement", "getNextIdFromModel: " + id);
    return id;
    }
    Log.e("RealmAutoIncrement", "getNextIdFromModel is called by a not valid method");
    return null;
    }

    private Integer updateIdByClassName(final Class<? extends RealmObject> clazz) {

    final AutoIncrementEntity autoIncrementEntity = getRealm().where(AutoIncrementEntity.class).findFirst();

    getRealm().executeTransaction(new Realm.Transaction() {

    @Override
    public void execute(Realm realm) {

    autoIncrementEntity.incrementByClassName(clazz.getSimpleName());
    realm.copyToRealmOrUpdate(autoIncrementEntity);
    }
    });
    return autoIncrementEntity.findByClassName(clazz.getSimpleName());
    }

    /**
    * Utility method to validate if the method is called from reflection,
    * in this case is considered a not valid call otherwise is a valid call
    *
    * @return The boolean which define if the method call is valid or not
    */
    private boolean isValidMethodCall() {

    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

    for (StackTraceElement stackTraceElement : stackTraceElements) {

    if (stackTraceElement.getMethodName().equals("newInstance")) {

    return false;
    }
    }
    return true;
    }

    private void createAutoIncrementEntityIfNotExist() {

    AutoIncrementEntity autoIncrementEntity = getRealm().where(AutoIncrementEntity.class).findFirst();

    if (autoIncrementEntity == null) {

    createAutoIncrementEntity();
    }
    }

    private void createAutoIncrementEntity() {

    getRealm().executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {

    AutoIncrementEntity autoIncrementEntity = new AutoIncrementEntity();
    realm.copyToRealm(autoIncrementEntity);
    }
    });
    }

    private Realm getRealm() {
    return Realm.getInstance(getRealmConfiguration());
    }

    @NonNull
    private RealmConfiguration getRealmConfiguration() {

    return new RealmConfiguration.Builder(CustomApplication.getContext())
    .deleteRealmIfMigrationNeeded()
    .build();
    }

    public static RealmAutoIncrement getInstance() {

    if (autoIncrementMap == null) {

    autoIncrementMap = new RealmAutoIncrement();
    }
    return autoIncrementMap;
    }
    }
    11 changes: 11 additions & 0 deletions UnknownModelException.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    package com.carloseduardo.exception;

    public class UnknownModelException extends RuntimeException {

    public UnknownModelException() {
    }

    public UnknownModelException(String message) {
    super(message);
    }
    }