Skip to content

Instantly share code, notes, and snippets.

@ryanamaral
Forked from daolq/ RealmAutoIncrement.java
Created October 17, 2016 18:34
Show Gist options
  • Select an option

  • Save ryanamaral/7f70bbae2c13ee4ac5af4a07559fd811 to your computer and use it in GitHub Desktop.

Select an option

Save ryanamaral/7f70bbae2c13ee4ac5af4a07559fd811 to your computer and use it in GitHub Desktop.
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import io.realm.Realm;
import io.realm.RealmObject;
/**
* RealmAutoIncrement.
*
* @author DaoLQ
*/
public final class RealmAutoIncrement {
private Map<Class<? extends RealmObject>, AtomicInteger> modelMap = new HashMap<>();
private static RealmAutoIncrement autoIncrementMap;
private Class<? extends RealmObject> mObj;
private RealmAutoIncrement(Class<? extends RealmObject> obj) {
mObj = obj;
modelMap.put(obj, new AtomicInteger(getLastIdFromModel(mObj)));
}
private int getLastIdFromModel(Class<? extends RealmObject> clazz) {
String primaryKeyColumnName = "id";
Number lastId = Realm.getDefaultInstance().where(clazz).max(primaryKeyColumnName);
return lastId == null ? 0 : lastId.intValue();
}
public Integer getNextIdFromModel() {
if (isValidMethodCall()) {
AtomicInteger modelId = modelMap.get(mObj);
if (modelId == null) {
return 0;
}
return modelId.incrementAndGet();
}
return 0;
}
private boolean isValidMethodCall() {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTraceElements) {
if (stackTraceElement.getMethodName().equals("newInstance")) {
return false;
}
}
return true;
}
public static RealmAutoIncrement getInstance(Class<? extends RealmObject> obj) {
if (autoIncrementMap == null) {
autoIncrementMap = new RealmAutoIncrement(obj);
}
return autoIncrementMap;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment