From 7e7df2fa3b7f825bc26be74fec28970d3a825458 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Vimberg Date: Sat, 31 Jan 2015 10:59:54 -0800 Subject: [PATCH] Fixing issue #243 Conflicts: library/build.gradle sugartestapp/src/androidTest/java/me/jivimberg/android/sugartestapp/robolectric/SugarRecordTest.java sugartestapp/src/main/java/me/jivimberg/android/sugartestapp/model/annotated/Car.java --- library/build.gradle | 1 + library/src/com/orm/SugarContext.java | 9 +++++++++ library/src/com/orm/SugarRecord.java | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/library/build.gradle b/library/build.gradle index 8d8edc7e..d64cd0e2 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -12,6 +12,7 @@ buildscript { dependencies { compile 'com.android.support:support-v4:21.0.3' + compile group: 'com.google.guava', name: 'guava', version: '12.0' } android { diff --git a/library/src/com/orm/SugarContext.java b/library/src/com/orm/SugarContext.java index ea853766..61acf813 100644 --- a/library/src/com/orm/SugarContext.java +++ b/library/src/com/orm/SugarContext.java @@ -2,15 +2,21 @@ import android.content.Context; +import com.google.common.collect.MapMaker; + +import java.util.concurrent.ConcurrentMap; + public class SugarContext { private static SugarContext instance = null; private SugarDb sugarDb; private Context context; + private ConcurrentMap entitiesMap; private SugarContext(Context context) { this.context = context; this.sugarDb = new SugarDb(context); + this.entitiesMap = new MapMaker().weakKeys().makeMap(); } public static SugarContext getSugarContext() { @@ -47,4 +53,7 @@ protected SugarDb getSugarDb() { return sugarDb; } + ConcurrentMap getEntitiesMap() { + return entitiesMap; + } } diff --git a/library/src/com/orm/SugarRecord.java b/library/src/com/orm/SugarRecord.java index d3a5e8fc..786ee6cd 100644 --- a/library/src/com/orm/SugarRecord.java +++ b/library/src/com/orm/SugarRecord.java @@ -180,23 +180,39 @@ public static long save(Object object) { } static long save(SQLiteDatabase db, Object object) { + Map entitiesMap = getSugarContext().getEntitiesMap(); List columns = ReflectionUtil.getTableFields(object.getClass()); ContentValues values = new ContentValues(columns.size()); for (Field column : columns) { ReflectionUtil.addFieldValueToColumn(values, column, object); } + boolean isSugarEntity = isSugarEntity(object); + if (isSugarEntity && entitiesMap.containsKey(object)) { + values.put("id", entitiesMap.get(object)); + } + long id = db.insertWithOnConflict(NamingHelper.toSQLName(object.getClass()), null, values, SQLiteDatabase.CONFLICT_REPLACE); + //TODO should we remove the id field from SugarRecord? if (SugarRecord.class.isAssignableFrom(object.getClass())) { ReflectionUtil.setFieldValueForId(object, id); } + + if (isSugarEntity) { + entitiesMap.put(object, id); + } + Log.i("Sugar", object.getClass().getSimpleName() + " saved : " + id); return id; } + private static boolean isSugarEntity(Object object) { + return object.getClass().isAnnotationPresent(Table.class) || SugarRecord.class.isAssignableFrom(object.getClass()); + } + private static void inflate(Cursor cursor, Object object) { List columns = ReflectionUtil.getTableFields(object.getClass());