├── .gitignore ├── .gitmodules ├── LICENSE ├── Libraries └── sugar │ └── library │ ├── build.gradle │ ├── build.properties │ ├── build.xml │ ├── gradle.properties │ └── src │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── orm │ │ ├── SchemaGenerator.java │ │ ├── SugarApp.java │ │ ├── SugarContext.java │ │ ├── SugarDb.java │ │ ├── SugarRecord.java │ │ ├── SugarTransactionHelper.java │ │ ├── dsl │ │ ├── Column.java │ │ ├── Ignore.java │ │ ├── MultiUnique.java │ │ ├── NotNull.java │ │ ├── Table.java │ │ └── Unique.java │ │ ├── query │ │ ├── Condition.java │ │ └── Select.java │ │ └── util │ │ ├── ContextUtil.java │ │ ├── KeyWordUtil.java │ │ ├── ManifestHelper.java │ │ ├── MigrationFileParser.java │ │ ├── MultiDexHelper.java │ │ ├── NamingHelper.java │ │ ├── NumberComparator.java │ │ ├── QueryBuilder.java │ │ ├── ReflectionUtil.java │ │ ├── SugarConfig.java │ │ ├── SugarCursor.java │ │ └── SugarCursorFactory.java │ └── test │ └── java │ └── com │ └── orm │ ├── NamingHelperTest.java │ ├── SchemaGeneratorTest.java │ ├── models │ ├── EmptyModel.java │ ├── IntUniqueModel.java │ ├── MultiColumnUniqueModel.java │ ├── StringFieldAnnotatedModel.java │ ├── StringFieldExtendedModel.java │ └── StringFieldExtendedModelAnnotatedColumn.java │ ├── query │ ├── DummyContext.java │ ├── QueryBuilderTests.java │ ├── SelectTest.java │ └── TestRecord.java │ └── util │ ├── ContextUtilTest.java │ ├── KeyWordUtilTest.java │ ├── ManifestHelperTest.java │ └── MigrationFileParserTest.java ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── raizlabs │ │ └── android │ │ └── databasecomparison │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── raizlabs │ │ └── android │ │ └── databasecomparison │ │ ├── Generator.java │ │ ├── MainActivity.java │ │ ├── MainApplication.java │ │ ├── Saver.java │ │ ├── Verificator.java │ │ ├── activeandroid │ │ ├── AATester.java │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ └── SimpleAddressItem.java │ │ ├── cupboard │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── CupboardDatabase.java │ │ ├── CupboardTester.java │ │ └── SimpleAddressItem.java │ │ ├── dbflow │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── DBFlowDatabase.java │ │ ├── DBFlowTester.java │ │ └── SimpleAddressItem.java │ │ ├── events │ │ ├── LogTestDataEvent.java │ │ └── TrialCompletedEvent.java │ │ ├── greendao │ │ ├── GreenDaoTester.java │ │ └── gen │ │ │ ├── AddressBook.java │ │ │ ├── AddressBookDao.java │ │ │ ├── AddressItem.java │ │ │ ├── AddressItemDao.java │ │ │ ├── Contact.java │ │ │ ├── ContactDao.java │ │ │ ├── DaoMaster.java │ │ │ ├── DaoSession.java │ │ │ ├── SimpleAddressItem.java │ │ │ └── SimpleAddressItemDao.java │ │ ├── interfaces │ │ ├── IAddressBook.java │ │ ├── IAddressItem.java │ │ ├── IContact.java │ │ └── ISaveable.java │ │ ├── ollie │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── OllieTester.java │ │ └── SimpleAddressItem.java │ │ ├── ormlite │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── DatabaseHelper.java │ │ ├── OrmLiteTester.java │ │ └── SimpleAddressItem.java │ │ ├── realm │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── RealmTester.java │ │ └── SimpleAddressItem.java │ │ ├── sprinkles │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── SimpleAddressItem.java │ │ └── SprinklesTester.java │ │ ├── sql │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── SimpleAddressItem.java │ │ ├── SqlHelper.java │ │ └── SqlTester.java │ │ └── sugar │ │ ├── AddressBook.java │ │ ├── AddressItem.java │ │ ├── Contact.java │ │ ├── SimpleAddressItem.java │ │ └── SugarTester.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── raw │ └── ormlite_config.txt │ ├── values-v21 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── greendaogenerator ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── raizlabs │ └── Generator.java ├── images ├── complex_read.png ├── complex_read_no_sg.png ├── complex_write.png ├── simple_read.png ├── simple_read_no_sg.png └── simple_write.png ├── ormlitegenerator ├── build.gradle ├── res │ └── raw │ │ └── ormlite_config.txt └── src │ └── main │ └── java │ └── com │ └── raizlabs │ ├── DatabaseConfigUtil.java │ └── android │ └── databasecomparison │ ├── interfaces │ ├── IAddressBook.java │ ├── IAddressItem.java │ ├── IContact.java │ └── ISaveable.java │ └── ormlite │ ├── AddressBook.java │ ├── AddressItem.java │ ├── Contact.java │ └── SimpleAddressItem.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | # Eclipse project files 23 | .classpath 24 | .project 25 | 26 | # Proguard folder generated by Eclipse 27 | proguard/ 28 | 29 | # Intellij project files 30 | *.iml 31 | *.ipr 32 | *.iws 33 | .idea/ 34 | crashlytics-build.properties 35 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Libraries/DBFlow"] 2 | path = Libraries/DBFlow 3 | url = https://github.com/Raizlabs/DBFlow.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Rexee 4 | Copyright (c) 2015 Raizlabs 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | 24 | -------------------------------------------------------------------------------- /Libraries/sugar/library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.3" 6 | 7 | defaultConfig { 8 | minSdkVersion 9 9 | targetSdkVersion 23 10 | } 11 | 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | } 16 | } 17 | 18 | testOptions{ 19 | unitTests.returnDefaultValues = true 20 | } 21 | 22 | lintOptions{ 23 | abortOnError false 24 | } 25 | } 26 | 27 | dependencies { 28 | testCompile 'junit:junit:4.12' 29 | } 30 | 31 | task libraryJar(type: Jar) { 32 | dependsOn assembleRelease 33 | from android.sourceSets.main.java.srcDirs, 34 | ['build/intermediates/classes/release/'] // Add the release classes into the jar 35 | baseName 'sugar' 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Libraries/sugar/library/build.properties: -------------------------------------------------------------------------------- 1 | jdk.home.1.6=$JAVA_HOME 2 | android.home=/Users/ADMIN/Downloads/android-sdk-macosx/platforms/android-17/android.jar 3 | android.travis.home=/usr/local/android-sdk/platforms/android-17/android.jar 4 | -------------------------------------------------------------------------------- /Libraries/sugar/library/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /Libraries/sugar/library/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Sugar ORM 2 | POM_ARTIFACT_ID=sugar 3 | POM_PACKAGING=aar -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/SugarApp.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import android.app.Application; 4 | 5 | public class SugarApp extends Application { 6 | 7 | @Override 8 | public void onCreate() { 9 | super.onCreate(); 10 | SugarContext.init(this); 11 | } 12 | 13 | @Override 14 | public void onTerminate() { 15 | super.onTerminate(); 16 | SugarContext.terminate(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/SugarContext.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import android.content.Context; 4 | 5 | import com.orm.util.ContextUtil; 6 | import com.orm.util.ManifestHelper; 7 | 8 | import java.util.Collections; 9 | import java.util.Map; 10 | import java.util.WeakHashMap; 11 | 12 | public class SugarContext { 13 | 14 | private static SugarContext instance = null; 15 | private SugarDb sugarDb; 16 | private Map entitiesMap; 17 | 18 | private SugarContext() { 19 | ManifestHelper.loadDebugEnabled(); 20 | this.sugarDb = SugarDb.getInstance(); 21 | this.entitiesMap = Collections.synchronizedMap(new WeakHashMap()); 22 | } 23 | 24 | public static SugarContext getSugarContext() { 25 | if (instance == null) { 26 | throw new NullPointerException("SugarContext has not been initialized properly. Call SugarContext.init(Context) in your Application.onCreate() method and SugarContext.terminate() in your Application.onTerminate() method."); 27 | } 28 | return instance; 29 | } 30 | 31 | public static void init(Context context) { 32 | ContextUtil.init(context); 33 | instance = new SugarContext(); 34 | } 35 | 36 | public static void terminate() { 37 | if (instance == null) { 38 | return; 39 | } 40 | instance.doTerminate(); 41 | ContextUtil.terminate(); 42 | } 43 | 44 | /* 45 | * Per issue #106 on Github, this method won't be called in 46 | * any real Android device. This method is used purely in 47 | * emulated process environments such as an emulator or 48 | * Robolectric Android mock. 49 | */ 50 | private void doTerminate() { 51 | if (this.sugarDb != null) { 52 | this.sugarDb.getDB().close(); 53 | } 54 | } 55 | 56 | public SugarDb getSugarDb() { 57 | return sugarDb; 58 | } 59 | 60 | Map getEntitiesMap() { 61 | return entitiesMap; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/SugarDb.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | import android.database.sqlite.SQLiteOpenHelper; 5 | import android.util.Log; 6 | 7 | import com.orm.util.ManifestHelper; 8 | import com.orm.util.SugarCursorFactory; 9 | 10 | import static com.orm.util.ContextUtil.getContext; 11 | import static com.orm.util.ManifestHelper.getDatabaseVersion; 12 | import static com.orm.util.ManifestHelper.getDbName; 13 | 14 | public class SugarDb extends SQLiteOpenHelper { 15 | private static final String LOG_TAG = "Sugar"; 16 | 17 | private final SchemaGenerator schemaGenerator; 18 | private SQLiteDatabase sqLiteDatabase; 19 | private int openedConnections = 0; 20 | 21 | //Prevent instantiation 22 | private SugarDb() { 23 | super(getContext(), getDbName(), new SugarCursorFactory(ManifestHelper.isDebugEnabled()), getDatabaseVersion()); 24 | schemaGenerator = SchemaGenerator.getInstance(); 25 | } 26 | 27 | public static SugarDb getInstance() { 28 | return new SugarDb(); 29 | } 30 | 31 | @Override 32 | public void onCreate(SQLiteDatabase sqLiteDatabase) { 33 | schemaGenerator.createDatabase(sqLiteDatabase); 34 | } 35 | 36 | @Override 37 | public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 38 | schemaGenerator.doUpgrade(sqLiteDatabase, oldVersion, newVersion); 39 | } 40 | 41 | public synchronized SQLiteDatabase getDB() { 42 | if (this.sqLiteDatabase == null) { 43 | this.sqLiteDatabase = getWritableDatabase(); 44 | } 45 | 46 | return this.sqLiteDatabase; 47 | } 48 | 49 | @Override 50 | public synchronized SQLiteDatabase getReadableDatabase() { 51 | Log.d(LOG_TAG, "getReadableDatabase"); 52 | openedConnections++; 53 | return super.getReadableDatabase(); 54 | } 55 | 56 | @Override 57 | public synchronized void close() { 58 | Log.d(LOG_TAG, "getReadableDatabase"); 59 | openedConnections--; 60 | if(openedConnections == 0) { 61 | Log.d(LOG_TAG, "closing"); 62 | super.close(); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/SugarTransactionHelper.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | import android.util.Log; 5 | 6 | public class SugarTransactionHelper { 7 | private static final String LOG_TAG = SugarTransactionHelper.class.getSimpleName(); 8 | 9 | public static void doInTransaction(SugarTransactionHelper.Callback callback) { 10 | SQLiteDatabase database = SugarContext.getSugarContext().getSugarDb().getDB(); 11 | database.beginTransaction(); 12 | 13 | try { 14 | Log.d(LOG_TAG, "Callback executing within transaction"); 15 | 16 | callback.manipulateInTransaction(); 17 | database.setTransactionSuccessful(); 18 | 19 | Log.d(LOG_TAG, "Callback successfully executed within transaction"); 20 | } catch (Throwable e) { 21 | Log.d(LOG_TAG, "Could execute callback within transaction", e); 22 | } finally { 23 | database.endTransaction(); 24 | } 25 | } 26 | 27 | public interface Callback { 28 | void manipulateInTransaction(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/Column.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface Column { 11 | String name(); 12 | boolean unique() default false; 13 | boolean notNull() default false; 14 | } 15 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/Ignore.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface Ignore { 11 | } 12 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/MultiUnique.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.TYPE) 10 | public @interface MultiUnique { 11 | String value(); 12 | } 13 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/NotNull.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface NotNull { 11 | } 12 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/Table.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.TYPE) 10 | public @interface Table { 11 | String name() default ""; 12 | } 13 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/dsl/Unique.java: -------------------------------------------------------------------------------- 1 | package com.orm.dsl; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface Unique { 11 | } 12 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/query/Condition.java: -------------------------------------------------------------------------------- 1 | package com.orm.query; 2 | 3 | import com.orm.SugarRecord; 4 | 5 | public class Condition { 6 | 7 | private String property; 8 | private Object value; 9 | private Check check; 10 | 11 | enum Check { 12 | EQUALS(" = "), 13 | GREATER_THAN(" > "), 14 | LESSER_THAN(" < "), 15 | NOT_EQUALS (" != "), 16 | LIKE(" LIKE "), 17 | NOT_LIKE(" NOT LIKE "), 18 | IS_NULL(" IS NULL "), 19 | IS_NOT_NULL(" IS NOT NULL "); 20 | 21 | private String symbol; 22 | 23 | Check(String symbol) { 24 | this.symbol = symbol; 25 | } 26 | 27 | public String getSymbol() { 28 | return symbol; 29 | } 30 | } 31 | 32 | enum Type { 33 | AND, 34 | OR, 35 | NOT 36 | } 37 | 38 | public Condition(String property) { 39 | this.property = property; 40 | } 41 | 42 | public static Condition prop(String property) { 43 | return new Condition(property); 44 | } 45 | 46 | public Condition eq(Object value) { 47 | if (value == null) { 48 | return isNull(); 49 | } 50 | setValue(value); 51 | check = Check.EQUALS; 52 | return this; 53 | } 54 | 55 | public Condition like(Object value) { 56 | setValue(value); 57 | check = Check.LIKE; 58 | return this; 59 | } 60 | 61 | public Condition notLike(Object value) { 62 | setValue(value); 63 | check = Check.NOT_LIKE; 64 | return this; 65 | } 66 | 67 | public Condition notEq(Object value) { 68 | if (value == null) { 69 | return isNotNull(); 70 | } 71 | setValue(value); 72 | check = Check.NOT_EQUALS; 73 | return this; 74 | } 75 | 76 | public Condition gt(Object value) { 77 | setValue(value); 78 | check = Check.GREATER_THAN; 79 | return this; 80 | } 81 | 82 | public Condition lt(Object value) { 83 | setValue(value); 84 | check = Check.LESSER_THAN; 85 | return this; 86 | } 87 | 88 | public Condition isNull() { 89 | setValue(null); 90 | check = Check.IS_NULL; 91 | return this; 92 | } 93 | 94 | public Condition isNotNull() { 95 | setValue(null); 96 | check = Check.IS_NOT_NULL; 97 | return this; 98 | } 99 | 100 | public String getProperty() { 101 | return property; 102 | } 103 | 104 | public Object getValue() { 105 | return value; 106 | } 107 | 108 | public Check getCheck() { 109 | return check; 110 | } 111 | 112 | public String getCheckSymbol() { 113 | return check.getSymbol(); 114 | } 115 | 116 | private void setValue(Object value) { 117 | if (value instanceof SugarRecord) { 118 | this.value = ((SugarRecord)value).getId(); 119 | } else { 120 | this.value = value; 121 | } 122 | } 123 | 124 | } 125 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/ContextUtil.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.content.pm.PackageManager; 6 | import android.content.res.AssetManager; 7 | 8 | /** 9 | * @author jonatan.salas 10 | */ 11 | public final class ContextUtil { 12 | private static Context ctx; 13 | 14 | //Prevent instantiation 15 | private ContextUtil() { } 16 | 17 | public static void init(Context context) { 18 | if (null == context) { 19 | throw new IllegalArgumentException("context shouldn't be null!"); 20 | } 21 | 22 | ctx = context; 23 | } 24 | 25 | public static void terminate() { 26 | ctx = null; 27 | } 28 | 29 | public static Context getContext() { 30 | return ctx; 31 | } 32 | 33 | public static AssetManager getAssets() { 34 | return getContext().getAssets(); 35 | } 36 | 37 | public static PackageManager getPackageManager() { 38 | return getContext().getPackageManager(); 39 | } 40 | 41 | public static String getPackageName() { 42 | return getContext().getPackageName(); 43 | } 44 | 45 | public static SharedPreferences getSharedPreferences(String name, int mode) { 46 | return getContext().getSharedPreferences(name, mode); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/KeyWordUtil.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | /** 4 | * @author jonatan.salas 5 | */ 6 | public final class KeyWordUtil { 7 | 8 | private static final String[] KEY_WORDS = new String[] { 9 | "", "ABORT", "ACTION", "ADD", "AFTER", "ALTER", "ANALYZE", "AND", "AS", "ASC", "ATTACH", 10 | "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY", "CASCADE", "CASE", "CAST", "CHECK", 11 | "COLLATE", "COLUMN", "COMMIT", "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE", 12 | "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", 13 | "DESC", "DETACH", "DISTINCT", "DROP", "EACH", "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", 14 | "EXISTS", "EXPLAIN", "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", 15 | "IF", "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER", "INSERT", "INSTEAD", 16 | "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY", "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", 17 | "NO", "NOT", "NOTNULL", "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA", 18 | "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP", "REINDEX", "RELEASE", "RENAME", 19 | "REPLACE", "RESTRICT", "RIGHT", "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP", 20 | "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE", "UPDATE", "USING", "VACUUM", 21 | "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE", "WITH", "WITHOUT" 22 | }; 23 | 24 | //Prevent instantiation 25 | private KeyWordUtil() { } 26 | 27 | public static boolean isKeyword(String word) { 28 | if (null == word) { 29 | return false; 30 | } 31 | 32 | for (String keyWord: KEY_WORDS) { 33 | if (keyWord.equals(word)) { 34 | return true; 35 | } 36 | } 37 | 38 | return false; 39 | } 40 | } 41 | 42 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/ManifestHelper.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import android.content.pm.ApplicationInfo; 4 | import android.content.pm.PackageManager; 5 | import android.util.Log; 6 | 7 | import static com.orm.util.ContextUtil.*; 8 | 9 | /** 10 | * Helper class for accessing properties in the AndroidManifest 11 | */ 12 | public final class ManifestHelper { 13 | private static final String LOG_TAG = "Sugar"; 14 | private static boolean debugEnabled; 15 | 16 | /** 17 | * Key for the database name meta data. 18 | */ 19 | public final static String METADATA_DATABASE = "DATABASE"; 20 | 21 | /** 22 | * Key for the database version meta data. 23 | */ 24 | public final static String METADATA_VERSION = "VERSION"; 25 | public final static String METADATA_DOMAIN_PACKAGE_NAME = "DOMAIN_PACKAGE_NAME"; 26 | public final static String METADATA_QUERY_LOG = "QUERY_LOG"; 27 | 28 | /** 29 | * The default name for the database unless specified in the AndroidManifest. 30 | */ 31 | public final static String DATABASE_DEFAULT_NAME = "Sugar.db"; 32 | 33 | //Prevent instantiation 34 | private ManifestHelper() { } 35 | 36 | /** 37 | * Grabs the database version from the manifest. 38 | * 39 | * @return the database version as specified by the {@link #METADATA_VERSION} version or 1 of 40 | * not present 41 | */ 42 | public static int getDatabaseVersion() { 43 | Integer databaseVersion = getMetaDataInteger(METADATA_VERSION); 44 | 45 | if ((databaseVersion == null) || (databaseVersion == 0)) { 46 | databaseVersion = 1; 47 | } 48 | 49 | return databaseVersion; 50 | } 51 | 52 | /** 53 | * Grabs the domain name of the model classes from the manifest. 54 | * 55 | * @return the package String that Sugar uses to search for model classes 56 | */ 57 | public static String getDomainPackageName() { 58 | String domainPackageName = getMetaDataString(METADATA_DOMAIN_PACKAGE_NAME); 59 | 60 | if (domainPackageName == null) { 61 | domainPackageName = ""; 62 | } 63 | 64 | return domainPackageName; 65 | } 66 | 67 | /** 68 | * Grabs the name of the database file specified in the manifest. 69 | * 70 | * @return the value for the {@value #METADATA_DATABASE} meta data in the AndroidManifest or 71 | * {@link #DATABASE_DEFAULT_NAME} if not present 72 | */ 73 | public static String getDatabaseName() { 74 | String databaseName = getMetaDataString(METADATA_DATABASE); 75 | 76 | if (databaseName == null) { 77 | databaseName = DATABASE_DEFAULT_NAME; 78 | } 79 | 80 | return databaseName; 81 | } 82 | 83 | public static String getDbName() { 84 | return getDatabaseName(); 85 | } 86 | 87 | /** 88 | * Grabs the debug flag from the manifest. 89 | * 90 | * @return true if the debug flag is enabled 91 | */ 92 | public static boolean isDebugEnabled() { 93 | return debugEnabled; 94 | } 95 | 96 | public static void loadDebugEnabled() { 97 | debugEnabled = getMetaDataBoolean(METADATA_QUERY_LOG); 98 | } 99 | 100 | private static String getMetaDataString(String name) { 101 | PackageManager pm = getPackageManager(); 102 | String value = null; 103 | 104 | try { 105 | ApplicationInfo ai = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 106 | value = ai.metaData.getString(name); 107 | } catch (Exception e) { 108 | Log.d(LOG_TAG, "Couldn't find config value: " + name); 109 | } 110 | 111 | return value; 112 | } 113 | 114 | private static Integer getMetaDataInteger(String name) { 115 | PackageManager pm = getPackageManager(); 116 | Integer value = null; 117 | 118 | try { 119 | ApplicationInfo ai = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 120 | value = ai.metaData.getInt(name); 121 | } catch (Exception e) { 122 | Log.d(LOG_TAG, "Couldn't find config value: " + name); 123 | } 124 | 125 | return value; 126 | } 127 | 128 | private static Boolean getMetaDataBoolean(String name) { 129 | PackageManager pm = getPackageManager(); 130 | Boolean value = false; 131 | 132 | try { 133 | ApplicationInfo ai = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 134 | value = ai.metaData.getBoolean(name); 135 | } catch (Exception e) { 136 | Log.d(LOG_TAG, "Couldn't find config value: " + name); 137 | } 138 | 139 | return value; 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/MigrationFileParser.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | /** 4 | * Created by Nursultan Turdaliev on 12/4/15. 5 | */ 6 | public class MigrationFileParser { 7 | 8 | private String content; 9 | 10 | /** 11 | * @param content 12 | */ 13 | public MigrationFileParser(String content){ 14 | this.content = content.replaceAll("(\\/\\*([\\s\\S]*?)\\*\\/)|(--(.)*)|(\n)",""); 15 | } 16 | 17 | public String[] getStatements(){ 18 | return this.content.split(";"); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/NamingHelper.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import com.orm.dsl.Column; 4 | import com.orm.dsl.Table; 5 | 6 | import java.lang.reflect.Field; 7 | 8 | public class NamingHelper { 9 | 10 | /** 11 | * Converts a given CamelCasedString to UPPER_CASE_UNDER_SCORE. 12 | * 13 | * @param camelCased a non empty camelCased string 14 | * @return the equivalent string converted to UPPER_CASE_UNDER_SCORE unless camelCased equals 15 | * "_id" (not case sensitive) in which case "_id" is returned 16 | */ 17 | public static String toSQLNameDefault(String camelCased) { 18 | if (camelCased.equalsIgnoreCase("_id")) { 19 | return "_id"; 20 | } 21 | 22 | StringBuilder sb = new StringBuilder(); 23 | char[] buf = camelCased.toCharArray(); 24 | 25 | for (int i = 0; i < buf.length; i++) { 26 | char prevChar = (i > 0) ? buf[i - 1] : 0; 27 | char c = buf[i]; 28 | char nextChar = (i < buf.length - 1) ? buf[i + 1] : 0; 29 | boolean isFirstChar = (i == 0); 30 | 31 | if (isFirstChar || Character.isLowerCase(c) || Character.isDigit(c)) { 32 | sb.append(Character.toUpperCase(c)); 33 | } else if (Character.isUpperCase(c)) { 34 | if (Character.isLetterOrDigit(prevChar)) { 35 | if (Character.isLowerCase(prevChar)) { 36 | sb.append('_').append(c); 37 | } else if (nextChar > 0 && Character.isLowerCase(nextChar)) { 38 | sb.append('_').append(c); 39 | } else { 40 | sb.append(c); 41 | } 42 | } else { 43 | sb.append(c); 44 | } 45 | } 46 | } 47 | 48 | return sb.toString(); 49 | } 50 | 51 | /** 52 | * Maps a Java Field object to the database's column name. 53 | * 54 | * @param field the {@link java.lang.reflect.Field} that will be mapped 55 | * @return the name of the given Field as represented in the database. If the Field is annotated 56 | * with {@link com.orm.dsl.Column} then the {@link com.orm.dsl.Column#name()} will be 57 | * returned. Else, the Field's {@link java.lang.reflect.Field#getName()} will be 58 | * converted from CamelCase to UNDER_SCORE notation 59 | */ 60 | public static String toSQLName(Field field) { 61 | if (field.isAnnotationPresent(Column.class)) { 62 | Column annotation = field.getAnnotation(Column.class); 63 | return annotation.name(); 64 | } 65 | 66 | return toSQLNameDefault(field.getName()); 67 | } 68 | 69 | /** 70 | * Maps a Java Class to the name of the class. 71 | * 72 | * @param table the generic {@link java.lang.Class} that defines a database table 73 | * @return if the given class is annotated with {@link com.orm.dsl.Table} then the value for 74 | * {@link com.orm.dsl.Table#name()} will be returned. Else, the class' simple name will 75 | * be converted from CamelCase to UNDER_SCORE notation 76 | */ 77 | public static String toSQLName(Class table) { 78 | if (table.isAnnotationPresent(Table.class)) { 79 | Table annotation = table.getAnnotation(Table.class); 80 | if ("".equals(annotation.name())) { 81 | return NamingHelper.toSQLNameDefault(table.getSimpleName()); 82 | } 83 | return annotation.name(); 84 | } 85 | 86 | return NamingHelper.toSQLNameDefault(table.getSimpleName()); 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/NumberComparator.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import java.util.Comparator; 4 | 5 | public class NumberComparator implements Comparator { 6 | 7 | private static char charAt(String s, int i) { 8 | if (i >= s.length()) { 9 | return '\000'; 10 | } 11 | 12 | return s.charAt(i); 13 | } 14 | 15 | private int compareRight(String a, String b) { 16 | int bias = 0; 17 | int ia = 0; 18 | int ib = 0; 19 | while (true) { 20 | char ca = charAt(a, ia); 21 | char cb = charAt(b, ib); 22 | 23 | if ((!Character.isDigit(ca)) && (!Character.isDigit(cb))) { 24 | return bias; 25 | } 26 | if (!Character.isDigit(ca)) { 27 | return -1; 28 | } 29 | if (!Character.isDigit(cb)) { 30 | return 1; 31 | } 32 | if (ca < cb) { 33 | if (bias == 0) { 34 | bias = -1; 35 | } 36 | } else if (ca > cb) { 37 | if (bias == 0) 38 | bias = 1; 39 | } else if ((ca == 0) && (cb == 0)) 40 | return bias; 41 | ia++; 42 | ib++; 43 | } 44 | } 45 | 46 | public int compare(Object o1, Object o2) { 47 | String a = o1.toString(); 48 | String b = o2.toString(); 49 | 50 | int ia = 0; 51 | int ib = 0; 52 | int nza; 53 | int nzb; 54 | while (true) { 55 | nza = nzb = 0; 56 | 57 | char ca = charAt(a, ia); 58 | char cb = charAt(b, ib); 59 | 60 | while ((Character.isSpaceChar(ca)) || (ca == '0')) { 61 | if (ca == '0') { 62 | nza++; 63 | } else { 64 | nza = 0; 65 | } 66 | 67 | ca = charAt(a, ++ia); 68 | } 69 | 70 | while ((Character.isSpaceChar(cb)) || (cb == '0')) { 71 | if (cb == '0') { 72 | nzb++; 73 | } else { 74 | nzb = 0; 75 | } 76 | 77 | cb = charAt(b, ++ib); 78 | } 79 | int result; 80 | if ((Character.isDigit(ca)) && (Character.isDigit(cb)) && 81 | ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)) { 82 | return result; 83 | } 84 | 85 | if ((ca == 0) && (cb == 0)) { 86 | return nza - nzb; 87 | } 88 | 89 | if (ca < cb) { 90 | return -1; 91 | } 92 | if (ca > cb) { 93 | return 1; 94 | } 95 | 96 | ia++; 97 | ib++; 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/QueryBuilder.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import com.orm.SugarRecord; 4 | 5 | import java.lang.RuntimeException; 6 | import java.lang.StringBuilder; 7 | import java.math.BigDecimal; 8 | 9 | public class QueryBuilder { 10 | 11 | public static String getColumnType(Class type) { 12 | if ((type.equals(Boolean.class)) || 13 | (type.equals(Boolean.TYPE)) || 14 | (type.equals(Integer.class)) || 15 | (type.equals(Integer.TYPE)) || 16 | (type.equals(Long.class)) || 17 | (type.equals(Long.TYPE)) || ( 18 | (!type.isPrimitive()) && 19 | (SugarRecord.class.isAssignableFrom(type)))) { 20 | return "INTEGER"; 21 | } 22 | 23 | if ((type.equals(java.util.Date.class)) || 24 | (type.equals(java.sql.Date.class)) || 25 | (type.equals(java.util.Calendar.class))) { 26 | return "INTEGER NULL"; 27 | } 28 | 29 | if (type.getName().equals("[B")) { 30 | return "BLOB"; 31 | } 32 | 33 | if ((type.equals(Double.class)) || (type.equals(Double.TYPE)) || (type.equals(Float.class)) || 34 | (type.equals(Float.TYPE))) { 35 | return "FLOAT"; 36 | } 37 | 38 | if ((type.equals(String.class)) || (type.equals(Character.TYPE)) || 39 | (type.equals(BigDecimal.class))) { 40 | return "TEXT"; 41 | } 42 | 43 | return ""; 44 | } 45 | 46 | public static String generatePlaceholders(int numberOfArgs) { 47 | if (numberOfArgs < 1) { 48 | throw new RuntimeException("The number of arguments must be greater than or equal to 1."); 49 | } 50 | 51 | StringBuilder stringBuilder = new StringBuilder(numberOfArgs * 2 - 1); 52 | stringBuilder.append("?"); 53 | for (int i = 1; i < numberOfArgs; i++) { 54 | stringBuilder.append(",?"); 55 | } 56 | return stringBuilder.toString(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/SugarConfig.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.Collections; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | public class SugarConfig { 10 | 11 | static Map, List> fields = new HashMap<>(); 12 | 13 | public static void setFields(Class clazz, List fieldz) { 14 | fields.put(clazz, fieldz); 15 | } 16 | 17 | public static List getFields(Class clazz) { 18 | if (fields.containsKey(clazz)) { 19 | List list = fields.get(clazz); 20 | return Collections.synchronizedList(list); 21 | } 22 | 23 | return null; 24 | } 25 | 26 | public static void clearCache() { 27 | fields.clear(); 28 | fields = new HashMap<>(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/SugarCursor.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import android.database.Cursor; 4 | import android.database.CursorWrapper; 5 | 6 | public class SugarCursor extends CursorWrapper { 7 | 8 | public SugarCursor(Cursor cursor) { 9 | super(cursor); 10 | } 11 | 12 | @Override 13 | public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException { 14 | try { 15 | return super.getColumnIndexOrThrow(columnName); 16 | } catch (IllegalArgumentException e) { 17 | if (columnName.equals("_id")) 18 | return super.getColumnIndexOrThrow("ID"); 19 | else 20 | throw e; 21 | } 22 | } 23 | 24 | @Override 25 | public int getColumnIndex(String columnName) { 26 | if (columnName.equals("_id")) 27 | columnName = "ID"; 28 | return super.getColumnIndex(columnName); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/main/java/com/orm/util/SugarCursorFactory.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import android.database.Cursor; 4 | import android.database.sqlite.SQLiteCursor; 5 | import android.database.sqlite.SQLiteCursorDriver; 6 | import android.database.sqlite.SQLiteDatabase; 7 | import android.database.sqlite.SQLiteQuery; 8 | import android.util.Log; 9 | 10 | public class SugarCursorFactory implements SQLiteDatabase.CursorFactory { 11 | 12 | private boolean debugEnabled; 13 | 14 | public SugarCursorFactory() { 15 | this.debugEnabled = false; 16 | } 17 | 18 | public SugarCursorFactory(boolean debugEnabled) { 19 | this.debugEnabled = debugEnabled; 20 | } 21 | 22 | @SuppressWarnings("deprecation") 23 | public Cursor newCursor(SQLiteDatabase sqLiteDatabase, 24 | SQLiteCursorDriver sqLiteCursorDriver, 25 | String editTable, 26 | SQLiteQuery sqLiteQuery) { 27 | 28 | if (debugEnabled) { 29 | Log.d("SQL Log", sqLiteQuery.toString()); 30 | } 31 | 32 | return new SQLiteCursor(sqLiteDatabase, sqLiteCursorDriver, editTable, sqLiteQuery); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/NamingHelperTest.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import com.orm.util.NamingHelper; 4 | 5 | import org.junit.Test; 6 | 7 | import static junit.framework.Assert.assertEquals; 8 | 9 | public class NamingHelperTest { 10 | @Test 11 | public void testToSQLNameCaseConversion() throws Exception { 12 | assertToSqlNameEquals("TESTLOWERCASE", "testlowercase"); 13 | assertToSqlNameEquals("TESTUPPERCASE", "TESTUPPERCASE"); 14 | } 15 | 16 | @Test 17 | public void testToSQLNameUnderscore() { 18 | assertToSqlNameEquals("TEST_UNDERSCORE", "testUnderscore"); 19 | assertToSqlNameEquals("AB_CD", "AbCd"); 20 | assertToSqlNameEquals("AB_CD", "ABCd"); 21 | assertToSqlNameEquals("AB_CD", "AbCD"); 22 | assertToSqlNameEquals("SOME_DETAILS_OBJECT", "SomeDetailsObject"); 23 | assertToSqlNameEquals("H_OL_A","hOlA"); 24 | assertToSqlNameEquals("A","a"); 25 | } 26 | 27 | /** 28 | * Helper method that asserts a CamelCaseString is converted to UPPER_CASE_UNDER_SCORE. 29 | * 30 | * @param expected a CamelCaseString 31 | * @param actual the expected UPPER_CASE_UNDER_SCORE string 32 | */ 33 | private static void assertToSqlNameEquals(String expected, String actual) { 34 | assertEquals(expected, NamingHelper.toSQLNameDefault(actual)); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/SchemaGeneratorTest.java: -------------------------------------------------------------------------------- 1 | package com.orm; 2 | 3 | import com.orm.models.EmptyModel; 4 | import com.orm.models.IntUniqueModel; 5 | import com.orm.models.MultiColumnUniqueModel; 6 | import com.orm.models.StringFieldAnnotatedModel; 7 | import com.orm.models.StringFieldExtendedModel; 8 | import com.orm.models.StringFieldExtendedModelAnnotatedColumn; 9 | import com.orm.query.DummyContext; 10 | import com.orm.util.ContextUtil; 11 | import com.orm.util.NamingHelper; 12 | 13 | import org.junit.Test; 14 | 15 | import static junit.framework.Assert.assertEquals; 16 | 17 | public class SchemaGeneratorTest { 18 | 19 | @Test 20 | public void testEmptyTableCreation() throws Exception { 21 | ContextUtil.init(new DummyContext()); 22 | SchemaGenerator schemaGenerator = SchemaGenerator.getInstance(); 23 | String createSQL = schemaGenerator.createTableSQL(EmptyModel.class); 24 | assertEquals( 25 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(EmptyModel.class) + 26 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT ) ", 27 | createSQL); 28 | } 29 | 30 | @Test 31 | public void testSimpleColumnTableCreation() throws Exception { 32 | ContextUtil.init(new DummyContext()); 33 | SchemaGenerator schemaGenerator = SchemaGenerator.getInstance(); 34 | String createSQL = schemaGenerator.createTableSQL(StringFieldExtendedModel.class); 35 | assertEquals( 36 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(StringFieldExtendedModel.class) + 37 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT , " + 38 | "NAME TEXT ) ", 39 | createSQL); 40 | 41 | String createSQL2 = schemaGenerator.createTableSQL(StringFieldAnnotatedModel.class); 42 | 43 | assertEquals( 44 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(StringFieldAnnotatedModel.class) + 45 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT , " + 46 | "NAME TEXT ) ", 47 | createSQL2); 48 | 49 | String createSQL3 = schemaGenerator.createTableSQL(StringFieldExtendedModelAnnotatedColumn.class); 50 | 51 | assertEquals( 52 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(StringFieldExtendedModelAnnotatedColumn.class) + 53 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT , " + 54 | "anyName TEXT ) ", 55 | createSQL3); 56 | } 57 | 58 | @Test 59 | public void testUniqueTableCreation() { 60 | ContextUtil.init(new DummyContext()); 61 | SchemaGenerator schemaGenerator = SchemaGenerator.getInstance(); 62 | String createSQL = schemaGenerator.createTableSQL(IntUniqueModel.class); 63 | assertEquals( 64 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(IntUniqueModel.class) + 65 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT , " + 66 | "VALUE INTEGER UNIQUE ) ", 67 | createSQL); 68 | } 69 | 70 | @Test 71 | public void testMultiColumnUniqueTableCreation() { 72 | ContextUtil.init(new DummyContext()); 73 | SchemaGenerator schemaGenerator = SchemaGenerator.getInstance(); 74 | String createSQL = schemaGenerator.createTableSQL(MultiColumnUniqueModel.class); 75 | assertEquals( 76 | "CREATE TABLE IF NOT EXISTS " + NamingHelper.toSQLName(MultiColumnUniqueModel.class) + 77 | " ( ID INTEGER PRIMARY KEY AUTOINCREMENT , " + 78 | "A INTEGER, B INTEGER, " + 79 | "UNIQUE(A, B) ON CONFLICT REPLACE ) ", 80 | createSQL); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/EmptyModel.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | 5 | /** 6 | * Created by sibelius on 02/12/15. 7 | */ 8 | public class EmptyModel extends SugarRecord { 9 | public EmptyModel() { } 10 | } 11 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/IntUniqueModel.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | import com.orm.dsl.Unique; 5 | 6 | /** 7 | * Created by sibelius on 02/12/15. 8 | */ 9 | public class IntUniqueModel extends SugarRecord { 10 | 11 | @Unique 12 | private int value; 13 | 14 | public IntUniqueModel() { } 15 | 16 | public IntUniqueModel(int value) { 17 | this.value = value; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/MultiColumnUniqueModel.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | import com.orm.dsl.MultiUnique; 5 | import com.orm.dsl.Unique; 6 | 7 | /** 8 | * Created by sibelius on 02/12/15. 9 | */ 10 | @MultiUnique("a, b") 11 | public class MultiColumnUniqueModel extends SugarRecord { 12 | 13 | private int a; 14 | private int b; 15 | 16 | public MultiColumnUniqueModel() { } 17 | 18 | public MultiColumnUniqueModel(int a, int b) { 19 | this.a = a; 20 | this.b = b; 21 | } 22 | } -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/StringFieldAnnotatedModel.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | import com.orm.dsl.Column; 5 | import com.orm.dsl.Table; 6 | 7 | /** 8 | * Created by sibelius on 02/12/15. 9 | */ 10 | @Table 11 | public class StringFieldAnnotatedModel extends SugarRecord { 12 | public String name; 13 | 14 | public StringFieldAnnotatedModel() { } 15 | 16 | public StringFieldAnnotatedModel(String name) { 17 | this.name = name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/StringFieldExtendedModel.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | 5 | /** 6 | * Created by sibelius on 02/12/15. 7 | */ 8 | public class StringFieldExtendedModel extends SugarRecord { 9 | public String name; 10 | 11 | public StringFieldExtendedModel() { } 12 | 13 | public StringFieldExtendedModel(String name) { 14 | this.name = name; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/models/StringFieldExtendedModelAnnotatedColumn.java: -------------------------------------------------------------------------------- 1 | package com.orm.models; 2 | 3 | import com.orm.SugarRecord; 4 | import com.orm.dsl.Column; 5 | 6 | /** 7 | * Created by sibelius on 02/12/15. 8 | */ 9 | public class StringFieldExtendedModelAnnotatedColumn extends SugarRecord { 10 | @Column(name="anyName") 11 | public String name; 12 | 13 | public StringFieldExtendedModelAnnotatedColumn() { } 14 | 15 | public StringFieldExtendedModelAnnotatedColumn(String name) { 16 | this.name = name; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/query/QueryBuilderTests.java: -------------------------------------------------------------------------------- 1 | package com.orm.query; 2 | 3 | import com.orm.util.QueryBuilder; 4 | 5 | import org.junit.Test; 6 | 7 | import static junit.framework.Assert.assertEquals; 8 | 9 | public class QueryBuilderTests { 10 | 11 | @Test(expected=RuntimeException.class) 12 | public void noArgumentsTest() { 13 | QueryBuilder.generatePlaceholders(0); 14 | } 15 | 16 | @Test() 17 | public void oneArgumentsTest() { 18 | assertEquals("?", QueryBuilder.generatePlaceholders(1)); 19 | } 20 | 21 | @Test 22 | public void twoArgumentsTest() { 23 | assertEquals("?,?", QueryBuilder.generatePlaceholders(2)); 24 | } 25 | 26 | @Test 27 | public void manyArgumentsTest() { 28 | assertEquals("?,?,?,?,?,?,?,?,?,?", QueryBuilder.generatePlaceholders(10)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/query/TestRecord.java: -------------------------------------------------------------------------------- 1 | package com.orm.query; 2 | 3 | import com.orm.SugarRecord; 4 | 5 | public class TestRecord extends SugarRecord { 6 | 7 | private String name; 8 | 9 | public TestRecord() { 10 | super(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/util/ContextUtilTest.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import android.content.Context; 4 | 5 | import com.orm.query.DummyContext; 6 | 7 | import org.junit.Test; 8 | 9 | 10 | import static junit.framework.Assert.assertNotNull; 11 | import static junit.framework.Assert.assertNull; 12 | import static com.orm.util.ContextUtil.*; 13 | 14 | /** 15 | * @author jonatan.salas 16 | */ 17 | public class ContextUtilTest { 18 | 19 | public void initContextUtil() { 20 | init(new DummyContext()); 21 | } 22 | 23 | @Test 24 | public void testInitContext() { 25 | initContextUtil(); 26 | assertNotNull(getContext()); 27 | } 28 | 29 | @Test 30 | public void testGetAssets() { 31 | initContextUtil(); 32 | assertNull(getAssets()); 33 | } 34 | 35 | @Test 36 | public void testGetPackageManager() { 37 | initContextUtil(); 38 | assertNull(getPackageManager()); 39 | } 40 | 41 | @Test 42 | public void testGetPackageName() { 43 | initContextUtil(); 44 | assertNull(getPackageName()); 45 | } 46 | 47 | @Test 48 | public void testGetPreferences() { 49 | initContextUtil(); 50 | assertNull(getSharedPreferences("lala", Context.MODE_PRIVATE)); 51 | } 52 | 53 | @Test 54 | public void testTerminateContext() { 55 | initContextUtil(); 56 | terminate(); 57 | assertNull(getContext()); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/util/KeyWordUtilTest.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import org.junit.Test; 4 | 5 | import static junit.framework.Assert.assertEquals; 6 | 7 | /** 8 | * @author jonatan.salas 9 | */ 10 | public class KeyWordUtilTest { 11 | 12 | @Test 13 | public void testKeyWord() { 14 | assertEquals(true, KeyWordUtil.isKeyword("SELECT")); 15 | assertEquals(true, KeyWordUtil.isKeyword("TRANSACTION")); 16 | assertEquals(true, KeyWordUtil.isKeyword("MATCH")); 17 | assertEquals(true, KeyWordUtil.isKeyword("AS")); 18 | assertEquals(true, KeyWordUtil.isKeyword("NOTNULL")); 19 | assertEquals(true, KeyWordUtil.isKeyword("NOT")); 20 | assertEquals(false, KeyWordUtil.isKeyword("PERSONS")); 21 | assertEquals(false, KeyWordUtil.isKeyword("NAME")); 22 | assertEquals(false, KeyWordUtil.isKeyword("LOCATION")); 23 | } 24 | 25 | @Test 26 | public void testNullKeyword() { 27 | assertEquals(false, KeyWordUtil.isKeyword(null)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/util/ManifestHelperTest.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import com.orm.query.DummyContext; 4 | 5 | import org.junit.Test; 6 | 7 | import static org.junit.Assert.*; 8 | import static com.orm.util.ManifestHelper.*; 9 | import static com.orm.util.ContextUtil.init; 10 | 11 | /** 12 | * @author jonatan.salas 13 | */ 14 | public class ManifestHelperTest { 15 | 16 | public void initContext() { 17 | init(new DummyContext()); 18 | } 19 | 20 | @Test 21 | public void testGetDbName() { 22 | initContext(); 23 | assertEquals(DATABASE_DEFAULT_NAME, getDatabaseName()); 24 | } 25 | 26 | @Test 27 | public void testGetDatabaseName() { 28 | initContext(); 29 | assertEquals(DATABASE_DEFAULT_NAME, getDatabaseName()); 30 | } 31 | 32 | @Test 33 | public void testGetDatabaseVersion() { 34 | initContext(); 35 | assertEquals(1, getDatabaseVersion()); 36 | } 37 | 38 | @Test 39 | public void testGetDomainPackageName() { 40 | initContext(); 41 | assertNotNull(getDomainPackageName()); 42 | } 43 | 44 | @Test 45 | public void testGetDebugEnabled() { 46 | initContext(); 47 | assertEquals(false, isDebugEnabled()); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Libraries/sugar/library/src/test/java/com/orm/util/MigrationFileParserTest.java: -------------------------------------------------------------------------------- 1 | package com.orm.util; 2 | 3 | import org.junit.Test; 4 | 5 | import java.lang.String; 6 | 7 | import static junit.framework.Assert.assertEquals; 8 | 9 | public class MigrationFileParserTest { 10 | 11 | @Test 12 | public void testSingleLineStatement() { 13 | MigrationFileParser singleLineComment = new MigrationFileParser("insert into table--comment"); 14 | 15 | String statements[] = singleLineComment.getStatements(); 16 | assertEquals("Testing single line statement size",1,statements.length); 17 | assertEquals("Testing single line statement content","insert into table",statements[0]); 18 | 19 | singleLineComment = new MigrationFileParser("insert into table--comment\n"); 20 | 21 | singleLineComment.getStatements(); 22 | assertEquals("Testing single line statement size",1,statements.length); 23 | assertEquals("Testing single line statement content","insert into table",statements[0]); 24 | } 25 | 26 | @Test 27 | public void testMultiLineComment() { 28 | MigrationFileParser multiLineComment = new MigrationFileParser("insert into table /**comment \n new line 2 \n new line 3 */hello"); 29 | 30 | String statements[] = multiLineComment.getStatements(); 31 | assertEquals("Testing multiline statement size",1,statements.length); 32 | assertEquals("Testing multiline comment","insert into table hello",statements[0]); 33 | } 34 | 35 | @Test 36 | public void testMixedComment() { 37 | MigrationFileParser mixedComment = new MigrationFileParser("insert into/*multiline\n **comment*/--comment"); 38 | 39 | String statements[] = mixedComment.getStatements(); 40 | 41 | assertEquals("Testing mixed comment statement size",1,statements.length); 42 | assertEquals("Testing mixed comment statments", "insert into", statements[0]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidDatabaseLibraryComparison 2 | A test between a few of the popular libraries running a speed test on how fast they load and save data. 3 | 4 | ## Benchmark Description 5 | 6 | There are two benchmarks: 7 | Simple model. Writes and reads 10000 times: 8 | ```java 9 | public class SimpleAddressItem{ 10 | String name; 11 | String address; 12 | String city; 13 | String state; 14 | long phone; 15 | } 16 | ``` 17 | Complex model. Writes and reads 50x times with 50 items in each collection: 18 | ```java 19 | public class AddressBook{ 20 | Long id; 21 | String name; 22 | String author; 23 | Collection addresses; 24 | Collection contacts; 25 | } 26 | public class AddressItem extends SimpleAddressItem { 27 | private AddressBook addressBook; 28 | } 29 | public class Contact{ 30 | String name; 31 | String email; 32 | AddressBook addressBook; 33 | } 34 | ``` 35 | 36 | 37 | ## Results 38 | 39 | These are the results for the Simple trial: 40 | Write: 41 | ![Simple model](images/simple_write.png "Simple model") 42 | Read: 43 | ![Simple model](images/simple_read.png "Simple model") 44 | Read without Sugar: 45 | ![Simple model](images/simple_read_no_sg.png "Simple model") 46 | 47 | And these are the results for the Complex trial: 48 | Write: 49 | ![Complex model](images/complex_write.png "Complex model") 50 | Read: 51 | ![Complex model](images/complex_read.png "Complex model") 52 | Read without Sugar: 53 | ![Complex model](images/complex_read_no_sg.png "Complex model") 54 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'com.neenbedankt.android-apt' 3 | apply plugin: 'com.raizlabs.griddle' 4 | apply plugin: 'realm-android' 5 | 6 | android { 7 | compileSdkVersion 22 8 | buildToolsVersion "22.0.1" 9 | 10 | defaultConfig { 11 | applicationId "com.raizlabs.android.databasecomparison" 12 | minSdkVersion 14 13 | targetSdkVersion 22 14 | versionCode 1 15 | versionName "1.0" 16 | } 17 | 18 | } 19 | 20 | dependencies { 21 | 22 | apt "com.github.Raizlabs.DBFlow:dbflow-processor:3.0.0-beta5" 23 | mod "com.github.Raizlabs.DBFlow:dbflow-core:3.0.0-beta5" 24 | mod "com.github.Raizlabs.DBFlow:dbflow:3.0.0-beta5" 25 | 26 | // apt 'com.raizlabs.android:DBFlow-Compiler:2.1.0' 27 | // mod "com.raizlabs.android:{DBFlow-Core, DBFlow}:2.1.0" 28 | 29 | // This switches to a local copy of the DBFlow repo 30 | //apt project(':Libraries:DBFlow:compiler') 31 | //compile project(":Libraries:DBFlow:library") 32 | //compile project(":Libraries:DBFlow:flowcore") 33 | 34 | mod 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' 35 | mod 'com.michaelpardo:ollie:0.3.2-SNAPSHOT' 36 | apt 'com.michaelpardo:ollie-compiler:0.3.2-SNAPSHOT' 37 | mod 'se.emilsjolander:sprinkles:1.3.1' 38 | 39 | //use 1.5+ versions if possible. 40 | //custom lib used only for removing "Log.i" spam. Pull request #568 fix this issue 41 | //mod 'com.github.satyan:sugar:1.4' 42 | compile project(":sugar") 43 | 44 | mod 'de.greenrobot:greendao:2.1.0' 45 | mod 'com.j256.ormlite:ormlite-android:4.48' 46 | mod 'nl.qbusict:cupboard:2.1.4' 47 | 48 | mod 'com.github.PhilJay:MPAndroidChart:v2.1.0' 49 | mod 'de.greenrobot:eventbus:2.4.0' 50 | } 51 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/andrewgrosner/Documents/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/raizlabs/android/databasecomparison/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/Generator.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison; 2 | 3 | import android.annotation.TargetApi; 4 | import android.os.Build; 5 | 6 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 7 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 8 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 9 | 10 | import java.util.ArrayList; 11 | import java.util.Collection; 12 | import java.util.List; 13 | 14 | /** 15 | * Description: 16 | */ 17 | public class Generator { 18 | 19 | public static final long PHONE = 7185555555l; 20 | public static final String ADDR = "5486 Memory Lane"; 21 | 22 | 23 | public static Collection getAddresses(Class itemClass, int count) { 24 | return getAddresses(itemClass, count, null, 0, true); 25 | } 26 | 27 | @TargetApi(Build.VERSION_CODES.KITKAT) 28 | public static > List 29 | getAddresses(Class itemClass, int count, AddressBook addressBook, int book_i, boolean assignBook) { 30 | List modelList = new ArrayList<>(); 31 | for (int i = 0; i < count; i++) { 32 | AddressItem model = null; 33 | try { 34 | model = itemClass.newInstance(); 35 | model.setName("Addr:" + i + "_Book:" + book_i); 36 | model.setAddress(ADDR); 37 | model.setCity("Bronx"); 38 | model.setState("NY"); 39 | model.setPhone(PHONE); 40 | if (assignBook && addressBook != null) { 41 | model.setAddressBook(addressBook); 42 | } 43 | modelList.add(model); 44 | } catch (InstantiationException | IllegalAccessException e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | return modelList; 49 | } 50 | 51 | @TargetApi(Build.VERSION_CODES.KITKAT) 52 | public static List 53 | getContacts(Class contactClass, int count, AddressBook addressBook, int book_i, boolean assignBook) { 54 | List modelList = new ArrayList<>(); 55 | for (int i = 0; i < count; i++) { 56 | Contact model = null; 57 | try { 58 | model = contactClass.newInstance(); 59 | model.setName("Contact:" + i + "_Book:" + book_i); 60 | model.setEmail("abgrosner@gmail.com"); 61 | if (assignBook && addressBook != null) { 62 | model.setAddressBook(addressBook); 63 | } 64 | modelList.add(model); 65 | } catch (InstantiationException | IllegalAccessException e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | return modelList; 70 | } 71 | 72 | @TargetApi(Build.VERSION_CODES.KITKAT) 73 | public static > Collection 76 | createAddressBooks(Class addressBookClass, Class contactClass, Class addressItemClass, int count, boolean assignBook) { 77 | Collection addressBooks = new ArrayList<>(); 78 | for (int i = 0; i < count; i++) { 79 | AddressBook addressBook = null; 80 | try { 81 | addressBook = addressBookClass.newInstance(); 82 | addressBook.setName("AddrBook:"+i); 83 | addressBook.setAuthor("Andrew Grosner"); 84 | addressBook.setAddresses(getAddresses(addressItemClass, count, addressBook, i, assignBook)); 85 | addressBook.setContacts(getContacts(contactClass, count, addressBook, i, assignBook)); 86 | addressBooks.add(addressBook); 87 | } catch (InstantiationException | IllegalAccessException e) { 88 | e.printStackTrace(); 89 | } 90 | 91 | } 92 | return addressBooks; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison; 2 | 3 | import com.activeandroid.ActiveAndroid; 4 | import com.activeandroid.Configuration; 5 | import com.j256.ormlite.logger.LocalLog; 6 | import com.orm.SugarApp; 7 | import com.orm.SugarContext; 8 | import com.raizlabs.android.databasecomparison.activeandroid.AddressBook; 9 | import com.raizlabs.android.databasecomparison.activeandroid.AddressItem; 10 | import com.raizlabs.android.databasecomparison.activeandroid.Contact; 11 | import com.raizlabs.android.databasecomparison.activeandroid.SimpleAddressItem; 12 | import com.raizlabs.android.dbflow.config.FlowManager; 13 | 14 | import io.realm.Realm; 15 | import io.realm.RealmConfiguration; 16 | import ollie.Ollie; 17 | import se.emilsjolander.sprinkles.Sprinkles; 18 | 19 | /** 20 | * Description: 21 | */ 22 | public class MainApplication extends SugarApp { 23 | 24 | @Override 25 | public void onCreate() { 26 | super.onCreate(); 27 | 28 | ActiveAndroid.initialize(new Configuration.Builder(this) 29 | .setDatabaseName("activeandroid") 30 | .setDatabaseVersion(1) 31 | .setModelClasses(SimpleAddressItem.class, AddressItem.class, 32 | AddressBook.class, Contact.class).create()); 33 | 34 | Ollie.with(this) 35 | .setName("ollie") 36 | .setVersion(1) 37 | .setLogLevel(Ollie.LogLevel.FULL) 38 | .init(); 39 | 40 | FlowManager.init(this); 41 | 42 | Sprinkles.init(this, "sprinkles.db", 1); 43 | 44 | SugarContext.init(this); 45 | 46 | Realm.setDefaultConfiguration(new RealmConfiguration.Builder(this).build()); 47 | 48 | System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "ERROR"); 49 | } 50 | 51 | @Override 52 | public void onTerminate() { 53 | super.onTerminate(); 54 | SugarContext.terminate(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/Saver.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.ISaveable; 4 | 5 | import java.util.Collection; 6 | 7 | /** 8 | * Description: 9 | */ 10 | public class Saver { 11 | 12 | public static void saveAll(Collection saveables) { 13 | for(ISaveable saveable: saveables) { 14 | saveable.saveAll(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/Verificator.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison; 2 | 3 | 4 | import android.util.Log; 5 | 6 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 7 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 8 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 9 | 10 | import java.util.Collection; 11 | 12 | /** 13 | * Description: 14 | */ 15 | public class Verificator { 16 | public static final String TAG = "Verify. "; 17 | 18 | /** 19 | * Trigger a load of all inner data to truly test speed of loading 20 | * 21 | * @param addressBooks 22 | */ 23 | public static void verify(String framework, Collection addressBooks) { 24 | if (addressBooks == null || addressBooks.size() != MainActivity.COMPLEX_LOOP_COUNT) { 25 | Log.e(TAG + framework, "AddrBook not match"); 26 | return; 27 | } 28 | 29 | String name; 30 | for (IAddressBook addressBook : addressBooks) { 31 | name = addressBook.getName(); 32 | if (name == null || !name.substring(0, 8).equals("AddrBook")) { 33 | Log.e(TAG + framework, "AddrBook not match"); 34 | return; 35 | } 36 | 37 | Collection addresses = addressBook.getAddresses(); 38 | if (addresses == null || addresses.size() != MainActivity.COMPLEX_LOOP_COUNT) { 39 | Log.e(TAG + framework, "Addr not match"); 40 | return; 41 | } 42 | for (IAddressItem type : addresses) { 43 | name = type.getName(); 44 | if (name == null || !name.substring(0, 4).equals("Addr")) { 45 | Log.e(TAG + framework, "Addr not match"); 46 | return; 47 | } 48 | } 49 | 50 | Collection contacts = addressBook.getContacts(); 51 | if (contacts == null || contacts.size() != MainActivity.COMPLEX_LOOP_COUNT) { 52 | Log.e(TAG + framework, "Contact not match"); 53 | return; 54 | } 55 | for (IContact contact : contacts) { 56 | if (contact.getAddressBookField() == null) { 57 | Log.e(TAG + framework, "Contact-AddrBook not match"); 58 | return; 59 | } 60 | name = contact.getName(); 61 | if (name == null || !name.substring(0, 7).equals("Contact")) { 62 | Log.e(TAG + framework, "Contact not match"); 63 | return; 64 | } 65 | } 66 | } 67 | Log.e(TAG + framework, "complex verify: OK"); 68 | } 69 | 70 | public static void verifySimple(String framework, Collection addressItems) { 71 | if (addressItems == null || addressItems.size() != MainActivity.SIMPLE_LOOP_COUNT) { 72 | Log.e(TAG + framework, "Simple addr not match"); 73 | return; 74 | } 75 | 76 | String name; 77 | long phone; 78 | String addr; 79 | for (IAddressItem address : addressItems) { 80 | name = address.getName(); 81 | if (name == null || !name.substring(0, 4).equals("Addr")) { 82 | Log.e(TAG + framework, "Addr not match"); 83 | return; 84 | } 85 | if (address.getPhone() != Generator.PHONE) { 86 | Log.e(TAG + framework, "Addr not match"); 87 | return; 88 | } 89 | if (!address.getAddress().equals(Generator.ADDR)) { 90 | Log.e(TAG + framework, "Addr not match"); 91 | return; 92 | } 93 | } 94 | Log.e(TAG + framework, "simple verify: OK"); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/activeandroid/AATester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.activeandroid; 2 | 3 | import com.activeandroid.ActiveAndroid; 4 | import com.activeandroid.query.Delete; 5 | import com.activeandroid.query.Select; 6 | import com.raizlabs.android.databasecomparison.Generator; 7 | import com.raizlabs.android.databasecomparison.MainActivity; 8 | import com.raizlabs.android.databasecomparison.Saver; 9 | import com.raizlabs.android.databasecomparison.Verificator; 10 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 11 | 12 | import java.util.Collection; 13 | 14 | import de.greenrobot.event.EventBus; 15 | 16 | /** 17 | * Description: 18 | */ 19 | public class AATester { 20 | public static final String FRAMEWORK_NAME = "ActiveAndroid"; 21 | 22 | public static void testAddressBooks() { 23 | new Delete().from(AddressItem.class).execute(); 24 | new Delete().from(Contact.class).execute(); 25 | new Delete().from(AddressBook.class).execute(); 26 | 27 | Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, true); 28 | 29 | long startTime = System.currentTimeMillis(); 30 | ActiveAndroid.beginTransaction(); 31 | try { 32 | Saver.saveAll(addressBooks); 33 | ActiveAndroid.setTransactionSuccessful(); 34 | } 35 | finally { 36 | ActiveAndroid.endTransaction(); 37 | } 38 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 39 | 40 | } 41 | 42 | public static void testAddressItems() { 43 | new Delete().from(SimpleAddressItem.class).execute(); 44 | 45 | final Collection activeAndroidModels = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 46 | 47 | long startTime = System.currentTimeMillis(); 48 | ActiveAndroid.beginTransaction(); 49 | try { 50 | Saver.saveAll(activeAndroidModels); 51 | ActiveAndroid.setTransactionSuccessful(); 52 | } 53 | finally { 54 | ActiveAndroid.endTransaction(); 55 | } 56 | 57 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 58 | 59 | } 60 | 61 | public static void testAddressBooksRead() { 62 | long startTime = System.currentTimeMillis(); 63 | Collection addressBooks = new Select().from(AddressBook.class).execute(); 64 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 65 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 66 | 67 | } 68 | 69 | public static void testAddressItemsRead() { 70 | long startTime = System.currentTimeMillis(); 71 | Collection activeAndroidModelLoad = new Select().from(SimpleAddressItem.class).execute(); 72 | Verificator.verifySimple(FRAMEWORK_NAME, activeAndroidModelLoad); 73 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 74 | 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/activeandroid/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.activeandroid; 2 | 3 | import com.activeandroid.Model; 4 | import com.activeandroid.annotation.Column; 5 | import com.activeandroid.annotation.Table; 6 | import com.activeandroid.query.Select; 7 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 8 | 9 | import java.util.Collection; 10 | 11 | /** 12 | * Description: 13 | */ 14 | @Table(name = "AddressBook") 15 | public class AddressBook extends Model implements IAddressBook { 16 | 17 | @Column(name = "name") 18 | private String name; 19 | 20 | @Column(name = "author") 21 | private String author; 22 | 23 | Collection addresses; 24 | 25 | Collection contacts; 26 | 27 | @Override 28 | public void setName(String name) { 29 | this.name = name; 30 | } 31 | 32 | @Override 33 | public String getName() { 34 | return name; 35 | } 36 | 37 | @Override 38 | public void setAuthor(String author) { 39 | this.author = author; 40 | } 41 | 42 | @Override 43 | public void setAddresses(Collection addresses) { 44 | this.addresses = addresses; 45 | } 46 | 47 | @Override 48 | public Collection getAddresses() { 49 | if (addresses == null) { 50 | addresses = new Select().from(AddressItem.class).where("addressBook = ?", getId()).execute(); 51 | } 52 | return addresses; 53 | } 54 | 55 | @Override 56 | public Collection getContacts() { 57 | if (contacts == null) { 58 | contacts = new Select().from(Contact.class).where("addressBook = ?", getId()).execute(); 59 | } 60 | return contacts; 61 | } 62 | 63 | public void setContacts(Collection contacts) { 64 | this.contacts = contacts; 65 | } 66 | 67 | @Override 68 | public void saveAll() { 69 | super.save(); 70 | for (AddressItem addressItem : addresses) { 71 | addressItem.saveAll(); 72 | } 73 | for (Contact contact : contacts) { 74 | contact.saveAll(); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/activeandroid/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.activeandroid; 2 | 3 | import com.activeandroid.annotation.Column; 4 | import com.activeandroid.annotation.Table; 5 | 6 | /** 7 | * Description: 8 | */ 9 | @Table(name = "AddressItem") 10 | public class AddressItem extends SimpleAddressItem { 11 | 12 | @Column(name = "addressBook") 13 | private AddressBook addressBook; 14 | 15 | @Override 16 | public void setAddressBook(AddressBook addressBook) { 17 | this.addressBook = addressBook; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/activeandroid/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.activeandroid; 2 | 3 | import com.activeandroid.Model; 4 | import com.activeandroid.annotation.Column; 5 | import com.activeandroid.annotation.Table; 6 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 7 | 8 | /** 9 | * Description: 10 | */ 11 | @Table(name = "contact") 12 | public class Contact extends Model implements IContact { 13 | 14 | @Column(name = "name") 15 | private String name; 16 | 17 | @Column(name = "email") 18 | private String email; 19 | 20 | @Column(name = "addressBook") 21 | private AddressBook addressBook; 22 | 23 | @Override 24 | public String getName() { 25 | return name; 26 | } 27 | 28 | @Override 29 | public void setName(String name) { 30 | this.name = name; 31 | } 32 | 33 | @Override 34 | public String getEmail() { 35 | return email; 36 | } 37 | 38 | @Override 39 | public void setEmail(String email) { 40 | this.email = email; 41 | } 42 | 43 | @Override 44 | public AddressBook getAddressBookField() { 45 | return addressBook; 46 | } 47 | 48 | @Override 49 | public void setAddressBook(AddressBook addressBook) { 50 | this.addressBook = addressBook; 51 | } 52 | 53 | @Override 54 | public void saveAll() { 55 | super.save(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/activeandroid/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.activeandroid; 2 | 3 | import com.activeandroid.Model; 4 | import com.activeandroid.annotation.Column; 5 | import com.activeandroid.annotation.Table; 6 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 7 | 8 | /** 9 | * Description: 10 | */ 11 | @Table(name = "SimpleAddressItem") 12 | public class SimpleAddressItem extends Model implements IAddressItem { 13 | 14 | @Column(name = "name") 15 | private String name; 16 | 17 | @Column(name = "address") 18 | private String address; 19 | 20 | @Column(name = "city") 21 | private String city; 22 | 23 | @Column(name = "state") 24 | private String state; 25 | 26 | @Column(name = "phone") 27 | private long phone; 28 | 29 | 30 | @Override 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | 35 | @Override 36 | public void setAddress(String address) { 37 | this.address = address; 38 | } 39 | 40 | @Override 41 | public void setCity(String city) { 42 | this.city = city; 43 | } 44 | 45 | @Override 46 | public void setState(String state) { 47 | this.state = state; 48 | } 49 | 50 | @Override 51 | public void setPhone(long phone) { 52 | this.phone = phone; 53 | } 54 | 55 | @Override 56 | public void setAddressBook(AddressBook addressBook) { 57 | 58 | } 59 | 60 | @Override 61 | public String getName() { 62 | return name; 63 | } 64 | 65 | @Override 66 | public long getPhone() { 67 | return phone; 68 | } 69 | 70 | @Override 71 | public String getAddress() { 72 | return address; 73 | } 74 | 75 | @Override 76 | public void saveAll() { 77 | super.save(); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 4 | 5 | import java.util.Collection; 6 | 7 | import nl.qbusict.cupboard.DatabaseCompartment; 8 | import nl.qbusict.cupboard.annotation.Ignore; 9 | 10 | /** 11 | * Description: 12 | */ 13 | public class AddressBook implements IAddressBook { 14 | 15 | public Long _id; 16 | private String name; 17 | private String author; 18 | 19 | @Ignore Collection addresses; 20 | @Ignore Collection contacts; 21 | 22 | @Override 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | @Override 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | @Override 33 | public void setAuthor(String author) { 34 | this.author = author; 35 | } 36 | 37 | @Override 38 | public void setAddresses(Collection addresses) { 39 | this.addresses = addresses; 40 | } 41 | 42 | @Override 43 | public Collection getAddresses() { 44 | return addresses; 45 | } 46 | 47 | @Override 48 | public Collection getContacts() { 49 | return contacts; 50 | } 51 | 52 | @Override 53 | public void setContacts(Collection contacts) { 54 | this.contacts = contacts; 55 | } 56 | 57 | public void saveAll(DatabaseCompartment dbc) { 58 | dbc.put(this); 59 | for (Contact c : contacts) { 60 | dbc.put(c); 61 | } 62 | for (AddressItem a : addresses) { 63 | dbc.put(a); 64 | } 65 | } 66 | 67 | @Override 68 | public void saveAll() { 69 | } 70 | 71 | public void loadAll(DatabaseCompartment dbc) { 72 | addresses = dbc.query(AddressItem.class).withSelection("addressBook = ?", String.valueOf(_id)).list(); 73 | contacts = dbc.query(Contact.class).withSelection("addressBook = ?", String.valueOf(_id)).list(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | /** 4 | * Description: 5 | */ 6 | public class AddressItem extends SimpleAddressItem { 7 | 8 | private AddressBook addressBook; 9 | 10 | @Override 11 | public void setAddressBook(AddressBook addressBook) { 12 | this.addressBook = addressBook; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | 5 | /** 6 | * Description: 7 | */ 8 | public class Contact implements IContact { 9 | 10 | public Long _id; 11 | 12 | private String name; 13 | 14 | private String email; 15 | 16 | public AddressBook addressBook; 17 | 18 | @Override 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | @Override 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | @Override 29 | public String getEmail() { 30 | return email; 31 | } 32 | 33 | @Override 34 | public void setEmail(String email) { 35 | this.email = email; 36 | } 37 | 38 | @Override 39 | public AddressBook getAddressBookField() { 40 | return addressBook; 41 | } 42 | 43 | @Override 44 | public void setAddressBook(AddressBook addressBook) { 45 | this.addressBook = addressBook; 46 | } 47 | 48 | @Override 49 | public void saveAll() { 50 | // super.save(); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/CupboardDatabase.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteOpenHelper; 6 | 7 | import nl.qbusict.cupboard.CupboardBuilder; 8 | 9 | import static nl.qbusict.cupboard.CupboardFactory.cupboard; 10 | import static nl.qbusict.cupboard.CupboardFactory.setCupboard; 11 | 12 | public class CupboardDatabase extends SQLiteOpenHelper { 13 | private static final String DATABASE_NAME = CupboardDatabase.class.getName() + ".db"; 14 | private static final int DATABASE_VERSION = 1; 15 | 16 | static { 17 | setCupboard(new CupboardBuilder().useAnnotations().build()); 18 | cupboard().register(AddressBook.class); 19 | cupboard().register(AddressItem.class); 20 | cupboard().register(Contact.class); 21 | cupboard().register(SimpleAddressItem.class); 22 | } 23 | 24 | public CupboardDatabase(Context context) { 25 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 26 | } 27 | 28 | @Override 29 | public void onCreate(SQLiteDatabase db) { 30 | cupboard().withDatabase(db).createTables(); 31 | } 32 | 33 | @Override 34 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 35 | cupboard().withDatabase(db).upgradeTables(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/CupboardTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | 6 | import com.raizlabs.android.databasecomparison.Generator; 7 | import com.raizlabs.android.databasecomparison.MainActivity; 8 | import com.raizlabs.android.databasecomparison.Verificator; 9 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 10 | 11 | import java.util.Collection; 12 | 13 | import de.greenrobot.event.EventBus; 14 | import nl.qbusict.cupboard.DatabaseCompartment; 15 | 16 | import static nl.qbusict.cupboard.CupboardFactory.cupboard; 17 | 18 | /** 19 | * Description: 20 | */ 21 | public class CupboardTester { 22 | public static final String FRAMEWORK_NAME = "Cupboard"; 23 | 24 | public static void testAddressItems(Context context) { 25 | CupboardDatabase database = new CupboardDatabase(context); 26 | SQLiteDatabase db = database.getWritableDatabase(); 27 | DatabaseCompartment dbc = cupboard().withDatabase(db); 28 | dbc.delete(SimpleAddressItem.class, null); 29 | 30 | Collection addresses = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 31 | long startTime = System.currentTimeMillis(); 32 | dbc.put(addresses); 33 | 34 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 35 | database.close(); 36 | } 37 | 38 | public static void testAddressItemsRead(Context context) { 39 | CupboardDatabase database = new CupboardDatabase(context); 40 | SQLiteDatabase db = database.getWritableDatabase(); 41 | DatabaseCompartment dbc = cupboard().withDatabase(db); 42 | 43 | long startTime = System.currentTimeMillis(); 44 | Collection addressItems = dbc.query(SimpleAddressItem.class).list(); 45 | Verificator.verifySimple(FRAMEWORK_NAME, addressItems); 46 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 47 | database.close(); 48 | } 49 | 50 | public static void testAddressBooks(Context context) { 51 | CupboardDatabase database = new CupboardDatabase(context); 52 | SQLiteDatabase db = database.getWritableDatabase(); 53 | DatabaseCompartment dbc = cupboard().withDatabase(db); 54 | dbc.delete(AddressBook.class, null); 55 | dbc.delete(Contact.class, null); 56 | dbc.delete(AddressItem.class, null); 57 | 58 | final Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, true); 59 | long startTime = System.currentTimeMillis(); 60 | 61 | db.beginTransaction(); 62 | try { 63 | for (AddressBook book : addressBooks) { 64 | book.saveAll(dbc); 65 | } 66 | db.setTransactionSuccessful(); 67 | } finally { 68 | db.endTransaction(); 69 | } 70 | 71 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 72 | database.close(); 73 | } 74 | 75 | public static void testAddressBooksRead(Context context) { 76 | CupboardDatabase database = new CupboardDatabase(context); 77 | SQLiteDatabase db = database.getWritableDatabase(); 78 | DatabaseCompartment dbc = cupboard().withDatabase(db); 79 | 80 | long startTime = System.currentTimeMillis(); 81 | Collection addressBooks = dbc.query(AddressBook.class).query().list(); 82 | for (AddressBook book : addressBooks) { 83 | book.loadAll(dbc); 84 | } 85 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 86 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 87 | database.close(); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/cupboard/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.cupboard; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | 5 | /** 6 | * Description: 7 | */ 8 | public class SimpleAddressItem implements IAddressItem { 9 | 10 | public Long _id; 11 | 12 | private String name; 13 | 14 | private String address; 15 | 16 | private String city; 17 | 18 | private String state; 19 | 20 | private long phone; 21 | 22 | @Override 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | @Override 28 | public void setAddress(String address) { 29 | this.address = address; 30 | } 31 | 32 | @Override 33 | public void setCity(String city) { 34 | this.city = city; 35 | } 36 | 37 | @Override 38 | public void setState(String state) { 39 | this.state = state; 40 | } 41 | 42 | @Override 43 | public void setPhone(long phone) { 44 | this.phone = phone; 45 | } 46 | 47 | @Override 48 | public void setAddressBook(AddressBook addressBook) { 49 | } 50 | 51 | @Override 52 | public String getName() { 53 | return name; 54 | } 55 | 56 | @Override 57 | public void saveAll() { 58 | } 59 | 60 | @Override 61 | public long getPhone() { 62 | return phone; 63 | } 64 | 65 | @Override 66 | public String getAddress() { 67 | return address; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.databasecomparison.MainActivity; 4 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 5 | import com.raizlabs.android.dbflow.annotation.Column; 6 | import com.raizlabs.android.dbflow.annotation.ModelContainer; 7 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 8 | import com.raizlabs.android.dbflow.annotation.Table; 9 | import com.raizlabs.android.dbflow.sql.language.Select; 10 | import com.raizlabs.android.dbflow.structure.BaseModel; 11 | 12 | import java.util.Collection; 13 | 14 | /** 15 | * Description: 16 | */ 17 | //3.x 18 | @ModelContainer 19 | @Table(database = DBFlowDatabase.class, cachingEnabled = true, cacheSize = MainActivity.COMPLEX_LOOP_COUNT) 20 | public class AddressBook extends BaseModel implements IAddressBook { 21 | 22 | //2.x 23 | //@ModelContainer 24 | //@Table(tableName = "AddressBook", databaseName = DBFlowDatabase.NAME) 25 | //public class AddressBook extends BaseCacheableModel implements IAddressBook { 26 | 27 | // @Column 28 | @PrimaryKey(autoincrement = true) 29 | long id; 30 | 31 | @Column(name = "name") String name; 32 | 33 | @Column(name = "author") String author; 34 | 35 | Collection addresses; 36 | 37 | Collection contacts; 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | @Override 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | public void setAuthor(String author) { 49 | this.author = author; 50 | } 51 | 52 | public void setAddresses(Collection addresses) { 53 | this.addresses = addresses; 54 | } 55 | 56 | //3.x 57 | // @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE, Method.LOAD}, variableName = "addresses") 58 | public Collection getAddresses() { 59 | if (addresses == null) { 60 | addresses = new Select().from(AddressItem.class).where(AddressItem_Table.addressBook_id.eq(id)).queryList(); 61 | } 62 | return addresses; 63 | } 64 | 65 | // 2.x 66 | // public Collection getAddresses() { 67 | // if (addresses == null) { 68 | // addresses = new Select().from(AddressItem.class).where(Condition.column(AddressItem$Table.ADDRESSBOOK_ADDRESSBOOK).is(id)).queryList(); 69 | // } 70 | // return addresses; 71 | // } 72 | 73 | //3.x 74 | // @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE, Method.LOAD}, variableName = "contacts") 75 | public Collection getContacts() { 76 | if (contacts == null) { 77 | contacts = new Select().from(Contact.class).where(Contact_Table.addressBook_id.eq(id)).queryList(); 78 | } 79 | return contacts; 80 | } 81 | 82 | //2.x 83 | // public Collection getContacts() { 84 | // if (contacts == null) { 85 | // contacts = new Select().from(Contact.class).where(Condition.column(Contact$Table.ADDRESSBOOK_ADDRESSBOOK).is(id)).queryList(); 86 | // } 87 | // return contacts; 88 | // } 89 | 90 | public void setContacts(Collection contacts) { 91 | this.contacts = contacts; 92 | } 93 | 94 | @Override 95 | public void saveAll() { 96 | super.insert(); 97 | for (AddressItem addressItem : addresses) { 98 | addressItem.setAddressBook(this); 99 | addressItem.saveAll(); 100 | } 101 | for (Contact contact : contacts) { 102 | contact.setAddressBook(this); 103 | contact.saveAll(); 104 | } 105 | } 106 | 107 | //2.x 108 | // @Override 109 | // public int getCacheSize() { 110 | // return MainActivity.COMPLEX_LOOP_COUNT; 111 | // } 112 | 113 | } -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | import com.raizlabs.android.dbflow.annotation.Column; 5 | import com.raizlabs.android.dbflow.annotation.ForeignKey; 6 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 7 | import com.raizlabs.android.dbflow.annotation.Table; 8 | import com.raizlabs.android.dbflow.config.FlowManager; 9 | import com.raizlabs.android.dbflow.structure.BaseModel; 10 | import com.raizlabs.android.dbflow.structure.container.ForeignKeyContainer; 11 | 12 | /** 13 | * Description: 14 | */ 15 | @Table(database = DBFlowDatabase.class)//3.x 16 | //@Table(databaseName = DBFlowDatabase.NAME)//2.x 17 | public class AddressItem extends BaseModel implements IAddressItem { 18 | 19 | // @Column 20 | @PrimaryKey(autoincrement = true) 21 | long id; 22 | 23 | @Column(name = "name") 24 | String name; 25 | 26 | @Column(name = "address") 27 | String address; 28 | 29 | @Column(name = "city") 30 | String city; 31 | 32 | @Column(name = "state") 33 | String state; 34 | 35 | @Column(name = "phone") 36 | long phone; 37 | 38 | 39 | @Override 40 | public void setName(String name) { 41 | this.name = name; 42 | } 43 | 44 | @Override 45 | public void setAddress(String address) { 46 | this.address = address; 47 | } 48 | 49 | @Override 50 | public void setCity(String city) { 51 | this.city = city; 52 | } 53 | 54 | @Override 55 | public void setState(String state) { 56 | this.state = state; 57 | } 58 | 59 | @Override 60 | public void setPhone(long phone) { 61 | this.phone = phone; 62 | } 63 | 64 | @Override 65 | public void saveAll() { 66 | super.insert(); 67 | } 68 | 69 | //3.x 70 | @ForeignKey(saveForeignKeyModel = false) 71 | ForeignKeyContainer addressBook; 72 | 73 | //2.x 74 | // @ForeignKey( 75 | // references = {@ForeignKeyReference(columnName = "addressBook", columnType = Long.class, foreignColumnName = "id")}, 76 | // saveForeignKeyModel = false) 77 | // @Column 78 | // ForeignKeyContainer addressBook; 79 | 80 | 81 | @Override 82 | public void setAddressBook(AddressBook addressBook) { 83 | //3.x 84 | this.addressBook = FlowManager.getContainerAdapter(AddressBook.class).toForeignKeyContainer(addressBook); 85 | 86 | //2.x 87 | // this.addressBook = new ForeignKeyContainer<>(AddressBook.class); 88 | // Map keys = new LinkedHashMap<>(); 89 | // keys.put(AddressBook$Table.ID, addressBook.id); 90 | // this.addressBook.setData(keys); 91 | } 92 | 93 | @Override 94 | public String getName() { 95 | return name; 96 | } 97 | 98 | @Override 99 | public long getPhone() { 100 | return phone; 101 | } 102 | 103 | @Override 104 | public String getAddress() { 105 | return address; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | import com.raizlabs.android.dbflow.annotation.Column; 5 | import com.raizlabs.android.dbflow.annotation.ForeignKey; 6 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 7 | import com.raizlabs.android.dbflow.annotation.Table; 8 | import com.raizlabs.android.dbflow.config.FlowManager; 9 | import com.raizlabs.android.dbflow.structure.BaseModel; 10 | import com.raizlabs.android.dbflow.structure.container.ForeignKeyContainer; 11 | 12 | /** 13 | * Description: 14 | */ 15 | @Table(database = DBFlowDatabase.class)//3.x 16 | //@Table(tableName = "contact", databaseName = DBFlowDatabase.NAME)//2.x 17 | public class Contact extends BaseModel implements IContact { 18 | 19 | @PrimaryKey(autoincrement = true) 20 | @Column 21 | long id; 22 | 23 | @Column(name = "name") 24 | String name; 25 | 26 | @Column(name = "email") 27 | String email; 28 | 29 | //2.x 30 | // @ForeignKey(references = {@ForeignKeyReference(columnName = "addressBook", foreignColumnName = "id", columnType = long.class)},saveForeignKeyModel = false) 31 | // @Column 32 | // ForeignKeyContainer addressBook; 33 | 34 | //3.x 35 | @ForeignKey(saveForeignKeyModel = false) 36 | ForeignKeyContainer addressBook; 37 | 38 | @Override 39 | public String getName() { 40 | return name; 41 | } 42 | 43 | @Override 44 | public void setName(String name) { 45 | this.name = name; 46 | } 47 | 48 | @Override 49 | public String getEmail() { 50 | return email; 51 | } 52 | 53 | @Override 54 | public void setEmail(String email) { 55 | this.email = email; 56 | } 57 | 58 | @Override 59 | public AddressBook getAddressBookField() { 60 | return addressBook.toModel(); 61 | } 62 | 63 | @Override 64 | public void setAddressBook(AddressBook addressBook) { 65 | //3.x 66 | this.addressBook = FlowManager.getContainerAdapter(AddressBook.class).toForeignKeyContainer(addressBook); 67 | 68 | //2.x 69 | // this.addressBook = new ForeignKeyContainer<>(AddressBook.class); 70 | // Map keys = new LinkedHashMap<>(); 71 | // keys.put(AddressBook$Table.ID, addressBook.id); 72 | // this.addressBook.setData(keys); 73 | // this.addressBook.setModel(addressBook); 74 | } 75 | 76 | @Override 77 | public void saveAll() { 78 | super.insert(); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/DBFlowDatabase.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.dbflow.annotation.Database; 4 | 5 | /** 6 | * Description: 7 | */ 8 | @Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION) 9 | public class DBFlowDatabase { 10 | 11 | public static final String NAME = "dbflow"; 12 | 13 | public static final int VERSION = 1; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/DBFlowTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.databasecomparison.Generator; 4 | import com.raizlabs.android.databasecomparison.MainActivity; 5 | import com.raizlabs.android.databasecomparison.Saver; 6 | import com.raizlabs.android.databasecomparison.Verificator; 7 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 8 | import com.raizlabs.android.dbflow.runtime.TransactionManager; 9 | import com.raizlabs.android.dbflow.sql.language.Select; 10 | 11 | import java.util.Collection; 12 | 13 | import de.greenrobot.event.EventBus; 14 | 15 | /** 16 | * Description: 17 | */ 18 | public class DBFlowTester { 19 | public static final String FRAMEWORK_NAME = "DBFlow"; 20 | 21 | public static void testAddressBooks() { 22 | com.raizlabs.android.dbflow.sql.language.Delete.tables(AddressItem.class, Contact.class, AddressBook.class); 23 | 24 | final Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, false); 25 | 26 | long startTime = System.currentTimeMillis(); 27 | TransactionManager.transact(DBFlowDatabase.NAME, new Runnable() { 28 | @Override 29 | public void run() { 30 | Saver.saveAll(addressBooks); 31 | } 32 | }); 33 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 34 | } 35 | 36 | public static void testAddressItems() { 37 | com.raizlabs.android.dbflow.sql.language.Delete.table(SimpleAddressItem.class); 38 | 39 | final Collection dbFlowModels = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 40 | 41 | long startTime = System.currentTimeMillis(); 42 | TransactionManager.transact(DBFlowDatabase.NAME, new Runnable() { 43 | @Override 44 | public void run() { 45 | Saver.saveAll(dbFlowModels); 46 | } 47 | }); 48 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 49 | } 50 | 51 | public static void testAddressBooksRead() { 52 | long startTime = System.currentTimeMillis(); 53 | Collection addressBooks = new Select().from(AddressBook.class).queryList(); 54 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 55 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 56 | } 57 | 58 | public static void testAddressItemsRead() { 59 | long startTime = System.currentTimeMillis(); 60 | Collection addressItems = new Select().from(SimpleAddressItem.class).queryList(); 61 | Verificator.verifySimple(FRAMEWORK_NAME, addressItems); 62 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/dbflow/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.dbflow; 2 | 3 | import com.raizlabs.android.databasecomparison.MainActivity; 4 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 5 | import com.raizlabs.android.dbflow.annotation.Column; 6 | import com.raizlabs.android.dbflow.annotation.PrimaryKey; 7 | import com.raizlabs.android.dbflow.annotation.Table; 8 | import com.raizlabs.android.dbflow.structure.BaseModel; 9 | 10 | /** 11 | * Description: 12 | */ 13 | //3.x 14 | @Table(database = DBFlowDatabase.class, cachingEnabled = true, cacheSize = MainActivity.COMPLEX_LOOP_COUNT) 15 | public class SimpleAddressItem extends BaseModel implements IAddressItem { 16 | 17 | //2.x 18 | //@Table(databaseName = DBFlowDatabase.NAME) 19 | //public class SimpleAddressItem extends BaseCacheableModel implements IAddressItem { 20 | 21 | @PrimaryKey(autoincrement = true) 22 | @Column 23 | long id; 24 | 25 | @Column(name = "name") 26 | String name; 27 | 28 | @Column(name = "address") 29 | String address; 30 | 31 | @Column(name = "city") 32 | String city; 33 | 34 | @Column(name = "state") 35 | String state; 36 | 37 | @Column(name = "phone") 38 | long phone; 39 | 40 | @Override 41 | public void setName(String name) { 42 | this.name = name; 43 | } 44 | 45 | @Override 46 | public void setAddress(String address) { 47 | this.address = address; 48 | } 49 | 50 | @Override 51 | public void setCity(String city) { 52 | this.city = city; 53 | } 54 | 55 | @Override 56 | public void setState(String state) { 57 | this.state = state; 58 | } 59 | 60 | @Override 61 | public void setPhone(long phone) { 62 | this.phone = phone; 63 | } 64 | 65 | @Override 66 | public void setAddressBook(AddressBook addressBook) { 67 | 68 | } 69 | 70 | @Override 71 | public String getName() { 72 | return name; 73 | } 74 | 75 | @Override 76 | public void saveAll() { 77 | super.insert(); 78 | } 79 | 80 | //2.x 81 | // @Override 82 | // public int getCacheSize() { 83 | // return MainActivity.SIMPLE_LOOP_COUNT; 84 | // } 85 | 86 | @Override 87 | public long getPhone() { 88 | return phone; 89 | } 90 | 91 | @Override 92 | public String getAddress() { 93 | return address; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/events/LogTestDataEvent.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.events; 2 | 3 | /** 4 | * Event to log data for a benchmark trial 5 | */ 6 | public class LogTestDataEvent { 7 | private long startTime; 8 | private long endTime; 9 | private String framework; 10 | private String eventName; 11 | 12 | public LogTestDataEvent(long startTime, long endTime, String framework, String eventName) { 13 | this.startTime = startTime; 14 | this.endTime = endTime; 15 | this.framework = framework; 16 | this.eventName = eventName; 17 | } 18 | 19 | public long getEndTime() { 20 | return endTime; 21 | } 22 | 23 | public long getStartTime() { 24 | return startTime; 25 | } 26 | 27 | public String getFramework() { 28 | return framework; 29 | } 30 | 31 | public String getEventName() { 32 | return eventName; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/events/TrialCompletedEvent.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.events; 2 | 3 | /** 4 | * Event to indicate that a trial has been completed 5 | */ 6 | public class TrialCompletedEvent { 7 | private final String trialName; 8 | 9 | public TrialCompletedEvent(String testName) { 10 | this.trialName = testName; 11 | } 12 | 13 | public String getTrialName() { 14 | return trialName; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/greendao/gen/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.greendao.gen; 2 | 3 | import com.raizlabs.android.databasecomparison.greendao.gen.DaoSession; 4 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 5 | 6 | import de.greenrobot.dao.DaoException; 7 | 8 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. 9 | /** 10 | * Entity mapped to table "CONTACT". 11 | */ 12 | public class Contact implements IContact { 13 | 14 | private Long id; 15 | private String name; 16 | private String email; 17 | private long addressbookId; 18 | 19 | /** Used to resolve relations */ 20 | private transient DaoSession daoSession; 21 | 22 | /** Used for active entity operations. */ 23 | private transient ContactDao myDao; 24 | 25 | private AddressBook addressBook; 26 | private Long addressBook__resolvedKey; 27 | 28 | 29 | public Contact() { 30 | } 31 | 32 | public Contact(Long id) { 33 | this.id = id; 34 | } 35 | 36 | public Contact(Long id, String name, String email, long addressbookId) { 37 | this.id = id; 38 | this.name = name; 39 | this.email = email; 40 | this.addressbookId = addressbookId; 41 | } 42 | 43 | /** called by internal mechanisms, do not call yourself. */ 44 | public void __setDaoSession(DaoSession daoSession) { 45 | this.daoSession = daoSession; 46 | myDao = daoSession != null ? daoSession.getContactDao() : null; 47 | } 48 | 49 | public Long getId() { 50 | return id; 51 | } 52 | 53 | public void setId(Long id) { 54 | this.id = id; 55 | } 56 | 57 | public String getName() { 58 | return name; 59 | } 60 | 61 | public void setName(String name) { 62 | this.name = name; 63 | } 64 | 65 | public String getEmail() { 66 | return email; 67 | } 68 | 69 | public void setEmail(String email) { 70 | this.email = email; 71 | } 72 | 73 | @Override 74 | public AddressBook getAddressBookField() { 75 | return getAddressBook(); 76 | } 77 | 78 | public long getAddressbookId() { 79 | return addressbookId; 80 | } 81 | 82 | public void setAddressbookId(long addressbookId) { 83 | this.addressbookId = addressbookId; 84 | } 85 | 86 | /** To-one relationship, resolved on first access. */ 87 | public AddressBook getAddressBook() { 88 | long __key = this.addressbookId; 89 | if (addressBook__resolvedKey == null || !addressBook__resolvedKey.equals(__key)) { 90 | if (daoSession == null) { 91 | throw new DaoException("Entity is detached from DAO context"); 92 | } 93 | AddressBookDao targetDao = daoSession.getAddressBookDao(); 94 | AddressBook addressBookNew = targetDao.load(__key); 95 | synchronized (this) { 96 | addressBook = addressBookNew; 97 | addressBook__resolvedKey = __key; 98 | } 99 | } 100 | return addressBook; 101 | } 102 | 103 | public void setAddressBook(AddressBook addressBook) { 104 | if (addressBook == null) { 105 | throw new DaoException("To-one property 'addressbookId' has not-null constraint; cannot set to-one to null"); 106 | } 107 | synchronized (this) { 108 | this.addressBook = addressBook; 109 | addressbookId = addressBook.getId(); 110 | addressBook__resolvedKey = addressbookId; 111 | } 112 | } 113 | 114 | /** Convenient call for {@link AbstractDao#delete(Object)}. Entity must attached to an entity context. */ 115 | public void delete() { 116 | if (myDao == null) { 117 | throw new DaoException("Entity is detached from DAO context"); 118 | } 119 | myDao.delete(this); 120 | } 121 | 122 | /** Convenient call for {@link AbstractDao#update(Object)}. Entity must attached to an entity context. */ 123 | public void update() { 124 | if (myDao == null) { 125 | throw new DaoException("Entity is detached from DAO context"); 126 | } 127 | myDao.update(this); 128 | } 129 | 130 | /** Convenient call for {@link AbstractDao#refresh(Object)}. Entity must attached to an entity context. */ 131 | public void refresh() { 132 | if (myDao == null) { 133 | throw new DaoException("Entity is detached from DAO context"); 134 | } 135 | myDao.refresh(this); 136 | } 137 | 138 | @Override 139 | public void saveAll() { 140 | 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/greendao/gen/DaoMaster.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.greendao.gen; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteDatabase.CursorFactory; 6 | import android.database.sqlite.SQLiteOpenHelper; 7 | import android.util.Log; 8 | import de.greenrobot.dao.AbstractDaoMaster; 9 | import de.greenrobot.dao.identityscope.IdentityScopeType; 10 | 11 | import com.raizlabs.android.databasecomparison.greendao.gen.SimpleAddressItemDao; 12 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressBookDao; 13 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressItemDao; 14 | import com.raizlabs.android.databasecomparison.greendao.gen.ContactDao; 15 | 16 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 17 | /** 18 | * Master of DAO (schema version 1): knows all DAOs. 19 | */ 20 | public class DaoMaster extends AbstractDaoMaster { 21 | public static final int SCHEMA_VERSION = 1; 22 | 23 | /** Creates underlying database table using DAOs. */ 24 | public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) { 25 | SimpleAddressItemDao.createTable(db, ifNotExists); 26 | AddressBookDao.createTable(db, ifNotExists); 27 | AddressItemDao.createTable(db, ifNotExists); 28 | ContactDao.createTable(db, ifNotExists); 29 | } 30 | 31 | /** Drops underlying database table using DAOs. */ 32 | public static void dropAllTables(SQLiteDatabase db, boolean ifExists) { 33 | SimpleAddressItemDao.dropTable(db, ifExists); 34 | AddressBookDao.dropTable(db, ifExists); 35 | AddressItemDao.dropTable(db, ifExists); 36 | ContactDao.dropTable(db, ifExists); 37 | } 38 | 39 | public static abstract class OpenHelper extends SQLiteOpenHelper { 40 | 41 | public OpenHelper(Context context, String name, CursorFactory factory) { 42 | super(context, name, factory, SCHEMA_VERSION); 43 | } 44 | 45 | @Override 46 | public void onCreate(SQLiteDatabase db) { 47 | Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); 48 | createAllTables(db, false); 49 | } 50 | } 51 | 52 | /** WARNING: Drops all table on Upgrade! Use only during development. */ 53 | public static class DevOpenHelper extends OpenHelper { 54 | public DevOpenHelper(Context context, String name, CursorFactory factory) { 55 | super(context, name, factory); 56 | } 57 | 58 | @Override 59 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 60 | Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); 61 | dropAllTables(db, true); 62 | onCreate(db); 63 | } 64 | } 65 | 66 | public DaoMaster(SQLiteDatabase db) { 67 | super(db, SCHEMA_VERSION); 68 | registerDaoClass(SimpleAddressItemDao.class); 69 | registerDaoClass(AddressBookDao.class); 70 | registerDaoClass(AddressItemDao.class); 71 | registerDaoClass(ContactDao.class); 72 | } 73 | 74 | public DaoSession newSession() { 75 | return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); 76 | } 77 | 78 | public DaoSession newSession(IdentityScopeType type) { 79 | return new DaoSession(db, type, daoConfigMap); 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/greendao/gen/DaoSession.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.greendao.gen; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | 5 | import java.util.Map; 6 | 7 | import de.greenrobot.dao.AbstractDao; 8 | import de.greenrobot.dao.AbstractDaoSession; 9 | import de.greenrobot.dao.identityscope.IdentityScopeType; 10 | import de.greenrobot.dao.internal.DaoConfig; 11 | 12 | import com.raizlabs.android.databasecomparison.greendao.gen.SimpleAddressItem; 13 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressBook; 14 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressItem; 15 | import com.raizlabs.android.databasecomparison.greendao.gen.Contact; 16 | 17 | import com.raizlabs.android.databasecomparison.greendao.gen.SimpleAddressItemDao; 18 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressBookDao; 19 | import com.raizlabs.android.databasecomparison.greendao.gen.AddressItemDao; 20 | import com.raizlabs.android.databasecomparison.greendao.gen.ContactDao; 21 | 22 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 23 | 24 | /** 25 | * {@inheritDoc} 26 | * 27 | * @see de.greenrobot.dao.AbstractDaoSession 28 | */ 29 | public class DaoSession extends AbstractDaoSession { 30 | 31 | private final DaoConfig simpleAddressItemDaoConfig; 32 | private final DaoConfig addressBookDaoConfig; 33 | private final DaoConfig addressItemDaoConfig; 34 | private final DaoConfig contactDaoConfig; 35 | 36 | private final SimpleAddressItemDao simpleAddressItemDao; 37 | private final AddressBookDao addressBookDao; 38 | private final AddressItemDao addressItemDao; 39 | private final ContactDao contactDao; 40 | 41 | public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map>, DaoConfig> 42 | daoConfigMap) { 43 | super(db); 44 | 45 | simpleAddressItemDaoConfig = daoConfigMap.get(SimpleAddressItemDao.class).clone(); 46 | simpleAddressItemDaoConfig.initIdentityScope(type); 47 | 48 | addressBookDaoConfig = daoConfigMap.get(AddressBookDao.class).clone(); 49 | addressBookDaoConfig.initIdentityScope(type); 50 | 51 | addressItemDaoConfig = daoConfigMap.get(AddressItemDao.class).clone(); 52 | addressItemDaoConfig.initIdentityScope(type); 53 | 54 | contactDaoConfig = daoConfigMap.get(ContactDao.class).clone(); 55 | contactDaoConfig.initIdentityScope(type); 56 | 57 | simpleAddressItemDao = new SimpleAddressItemDao(simpleAddressItemDaoConfig, this); 58 | addressBookDao = new AddressBookDao(addressBookDaoConfig, this); 59 | addressItemDao = new AddressItemDao(addressItemDaoConfig, this); 60 | contactDao = new ContactDao(contactDaoConfig, this); 61 | 62 | registerDao(SimpleAddressItem.class, simpleAddressItemDao); 63 | registerDao(AddressBook.class, addressBookDao); 64 | registerDao(AddressItem.class, addressItemDao); 65 | registerDao(Contact.class, contactDao); 66 | } 67 | 68 | public void clear() { 69 | simpleAddressItemDaoConfig.getIdentityScope().clear(); 70 | addressBookDaoConfig.getIdentityScope().clear(); 71 | addressItemDaoConfig.getIdentityScope().clear(); 72 | contactDaoConfig.getIdentityScope().clear(); 73 | } 74 | 75 | public SimpleAddressItemDao getSimpleAddressItemDao() { 76 | return simpleAddressItemDao; 77 | } 78 | 79 | public AddressBookDao getAddressBookDao() { 80 | return addressBookDao; 81 | } 82 | 83 | public AddressItemDao getAddressItemDao() { 84 | return addressItemDao; 85 | } 86 | 87 | public ContactDao getContactDao() { 88 | return contactDao; 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/greendao/gen/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.greendao.gen; 2 | 3 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. 4 | 5 | import com.raizlabs.android.databasecomparison.dbflow.AddressBook; 6 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 7 | 8 | /** 9 | * Entity mapped to table "SIMPLE_ADDRESS_ITEM". 10 | */ 11 | public class SimpleAddressItem implements IAddressItem { 12 | 13 | private Long id; 14 | private String name; 15 | private String address; 16 | private String city; 17 | private String state; 18 | private Long phone; 19 | 20 | public SimpleAddressItem() { 21 | } 22 | 23 | public SimpleAddressItem(Long id) { 24 | this.id = id; 25 | } 26 | 27 | public SimpleAddressItem(Long id, String name, String address, String city, String state, Long phone) { 28 | this.id = id; 29 | this.name = name; 30 | this.address = address; 31 | this.city = city; 32 | this.state = state; 33 | this.phone = phone; 34 | } 35 | 36 | public Long getId() { 37 | return id; 38 | } 39 | 40 | public void setId(Long id) { 41 | this.id = id; 42 | } 43 | 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | public void setName(String name) { 49 | this.name = name; 50 | } 51 | 52 | public String getAddress() { 53 | return address; 54 | } 55 | 56 | public void setAddress(String address) { 57 | this.address = address; 58 | } 59 | 60 | public String getCity() { 61 | return city; 62 | } 63 | 64 | public void setCity(String city) { 65 | this.city = city; 66 | } 67 | 68 | public String getState() { 69 | return state; 70 | } 71 | 72 | public void setState(String state) { 73 | this.state = state; 74 | } 75 | 76 | @Override 77 | public void setPhone(long phone) { 78 | this.phone = phone; 79 | } 80 | 81 | @Override 82 | public void setAddressBook(AddressBook addressBook) { 83 | 84 | } 85 | 86 | public long getPhone() { 87 | return phone; 88 | } 89 | 90 | @Override 91 | public void saveAll() { 92 | 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/interfaces/IAddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.interfaces; 2 | 3 | import java.util.Collection; 4 | 5 | /** 6 | * Description: interface for address book objects 7 | */ 8 | public interface IAddressBook extends ISaveable { 9 | 10 | void setName(String name); 11 | 12 | String getName(); 13 | 14 | void setAuthor(String author); 15 | 16 | void setAddresses(Collection addresses); 17 | 18 | Collection getAddresses(); 19 | 20 | Collection getContacts(); 21 | 22 | void setContacts(Collection contacts); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/interfaces/IAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.interfaces; 2 | 3 | /** 4 | * Description: interface for address book items objects in address book 5 | */ 6 | public interface IAddressItem extends ISaveable { 7 | 8 | void setName(String name); 9 | 10 | void setAddress(String address); 11 | 12 | void setCity(String city); 13 | 14 | void setState(String state); 15 | 16 | void setPhone(long phone); 17 | 18 | void setAddressBook(AddressBook addressBook); 19 | 20 | String getName(); 21 | long getPhone(); 22 | String getAddress(); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/interfaces/IContact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.interfaces; 2 | 3 | /** 4 | * Description: interface for contact objects in address book 5 | */ 6 | public interface IContact extends ISaveable { 7 | 8 | String getName(); 9 | 10 | void setName(String name); 11 | 12 | String getEmail(); 13 | 14 | void setEmail(String email); 15 | 16 | AddressBook getAddressBookField(); 17 | 18 | void setAddressBook(AddressBook addressBook); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/interfaces/ISaveable.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.interfaces; 2 | 3 | /** 4 | * Description: interface for address book objects for saving themself and their child objects 5 | */ 6 | public interface ISaveable { 7 | 8 | void saveAll(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ollie/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ollie; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 4 | 5 | import java.util.Collection; 6 | 7 | import ollie.Model; 8 | import ollie.annotation.Column; 9 | import ollie.annotation.Table; 10 | import ollie.query.Select; 11 | 12 | /** 13 | * Description: 14 | */ 15 | @Table("AddressBook") 16 | public class AddressBook extends Model implements IAddressBook { 17 | 18 | @Column("name") 19 | public String name; 20 | 21 | @Column("author") 22 | public String author; 23 | 24 | Collection addresses; 25 | 26 | Collection contacts; 27 | 28 | @Override 29 | public void setName(String name) { 30 | this.name = name; 31 | } 32 | 33 | @Override 34 | public String getName() { 35 | return name; 36 | } 37 | 38 | @Override 39 | public void setAuthor(String author) { 40 | this.author = author; 41 | } 42 | 43 | @Override 44 | public void setAddresses(Collection addresses) { 45 | this.addresses = addresses; 46 | } 47 | 48 | @Override 49 | public Collection getAddresses() { 50 | if (addresses == null) { 51 | addresses = Select.from(AddressItem.class).where("addressBook = ?", id).fetch(); 52 | } 53 | return addresses; 54 | } 55 | 56 | @Override 57 | public Collection getContacts() { 58 | if (contacts == null) { 59 | contacts = Select.from(Contact.class).where("addressBook = ?", id).fetch(); 60 | } 61 | return contacts; 62 | } 63 | 64 | public void setContacts(Collection contacts) { 65 | this.contacts = contacts; 66 | } 67 | 68 | @Override 69 | public void saveAll() { 70 | super.save(); 71 | for (AddressItem addressItem : addresses) { 72 | addressItem.saveAll(); 73 | } 74 | for (Contact contact : contacts) { 75 | contact.saveAll(); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ollie/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ollie; 2 | 3 | 4 | import ollie.annotation.Column; 5 | import ollie.annotation.Table; 6 | 7 | /** 8 | * Description: 9 | */ 10 | @Table("AddressItem") 11 | public class AddressItem extends SimpleAddressItem 12 | { 13 | 14 | @Column("addressBook") 15 | public AddressBook addressBook; 16 | 17 | @Override 18 | public void setAddressBook(AddressBook addressBook) { 19 | this.addressBook = addressBook; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ollie/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ollie; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | 5 | import ollie.Model; 6 | import ollie.annotation.Column; 7 | import ollie.annotation.Table; 8 | 9 | /** 10 | * Description: 11 | */ 12 | @Table("contact") 13 | public class Contact extends Model implements IContact { 14 | 15 | @Column("name") 16 | public String name; 17 | 18 | @Column("email") 19 | public String email; 20 | 21 | @Column("addressBook") 22 | public AddressBook addressBook; 23 | 24 | @Override 25 | public String getName() { 26 | return name; 27 | } 28 | 29 | @Override 30 | public void setName(String name) { 31 | this.name = name; 32 | } 33 | 34 | @Override 35 | public String getEmail() { 36 | return email; 37 | } 38 | 39 | @Override 40 | public void setEmail(String email) { 41 | this.email = email; 42 | } 43 | 44 | @Override 45 | public AddressBook getAddressBookField() { 46 | return addressBook; 47 | } 48 | 49 | @Override 50 | public void setAddressBook(AddressBook addressBook) { 51 | this.addressBook = addressBook; 52 | } 53 | 54 | @Override 55 | public void saveAll() { 56 | super.save(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ollie/OllieTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ollie; 2 | 3 | import android.database.sqlite.SQLiteDatabase; 4 | 5 | import com.raizlabs.android.databasecomparison.Generator; 6 | import com.raizlabs.android.databasecomparison.MainActivity; 7 | import com.raizlabs.android.databasecomparison.Saver; 8 | import com.raizlabs.android.databasecomparison.Verificator; 9 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 10 | 11 | import java.util.Collection; 12 | 13 | import de.greenrobot.event.EventBus; 14 | import ollie.Ollie; 15 | import ollie.query.Delete; 16 | import ollie.query.Select; 17 | 18 | /** 19 | * Created by Tjones on 8/16/15. 20 | */ 21 | public class OllieTester { 22 | public static final String FRAMEWORK_NAME = "Ollie"; 23 | 24 | public static void testAddressBooks() { 25 | Delete.from(AddressItem.class).execute(); 26 | Delete.from(Contact.class).execute(); 27 | Delete.from(AddressBook.class).execute(); 28 | 29 | Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, true); 30 | 31 | long startTime = System.currentTimeMillis(); 32 | SQLiteDatabase db = Ollie.getDatabase(); 33 | db.beginTransaction(); 34 | try { 35 | Saver.saveAll(addressBooks); 36 | db.setTransactionSuccessful(); 37 | } 38 | finally { 39 | db.endTransaction(); 40 | } 41 | 42 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 43 | 44 | } 45 | 46 | public static void testAddressItems() { 47 | Delete.from(SimpleAddressItem.class).execute(); 48 | 49 | final Collection ollieModels = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 50 | 51 | long startTime = System.currentTimeMillis(); 52 | SQLiteDatabase db = Ollie.getDatabase(); 53 | db.beginTransaction(); 54 | try { 55 | Saver.saveAll(ollieModels); 56 | db.setTransactionSuccessful(); 57 | } 58 | finally { 59 | db.endTransaction(); 60 | } 61 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 62 | 63 | } 64 | 65 | public static void testAddressBooksRead() { 66 | long startTime = System.currentTimeMillis(); 67 | Collection addressBooks = Select.from(AddressBook.class).fetch(); 68 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 69 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 70 | 71 | } 72 | 73 | public static void testAddressItemsRead() { 74 | long startTime = System.currentTimeMillis(); 75 | Collection activeAndroidModelLoad = Select.from(SimpleAddressItem.class).fetch(); 76 | Verificator.verifySimple(FRAMEWORK_NAME, activeAndroidModelLoad); 77 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 78 | 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ollie/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ollie; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | 5 | import ollie.Model; 6 | import ollie.annotation.Column; 7 | import ollie.annotation.Table; 8 | 9 | /** 10 | * Description: 11 | */ 12 | @Table("SimpleAddressItem") 13 | public class SimpleAddressItem extends Model implements IAddressItem { 14 | 15 | @Column("name") 16 | public String name; 17 | 18 | @Column("address") 19 | public String address; 20 | 21 | @Column("city") 22 | public String city; 23 | 24 | @Column("state") 25 | public String state; 26 | 27 | @Column("phone") 28 | public Long phone; 29 | 30 | 31 | @Override 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | @Override 37 | public void setAddress(String address) { 38 | this.address = address; 39 | } 40 | 41 | @Override 42 | public void setCity(String city) { 43 | this.city = city; 44 | } 45 | 46 | @Override 47 | public void setState(String state) { 48 | this.state = state; 49 | } 50 | 51 | @Override 52 | public void setPhone(long phone) { 53 | this.phone = phone; 54 | } 55 | 56 | @Override 57 | public void setAddressBook(AddressBook addressBook) { 58 | 59 | } 60 | 61 | @Override 62 | public String getName() { 63 | return name; 64 | } 65 | 66 | @Override 67 | public void saveAll() { 68 | super.save(); 69 | } 70 | 71 | @Override 72 | public long getPhone() { 73 | return phone; 74 | } 75 | 76 | @Override 77 | public String getAddress() { 78 | return address; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ormlite/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ormlite; 2 | 3 | import com.j256.ormlite.dao.Dao; 4 | import com.j256.ormlite.dao.ForeignCollection; 5 | import com.j256.ormlite.field.DatabaseField; 6 | import com.j256.ormlite.field.ForeignCollectionField; 7 | import com.j256.ormlite.table.DatabaseTable; 8 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 9 | 10 | import java.sql.SQLException; 11 | import java.util.Collection; 12 | 13 | 14 | /** 15 | * Description: Address Book DAO 16 | */ 17 | @DatabaseTable(tableName = "AddressBook") 18 | public class AddressBook implements IAddressBook { 19 | 20 | @DatabaseField(generatedId = true) 21 | private int id; 22 | 23 | @DatabaseField 24 | private String name; 25 | 26 | @DatabaseField 27 | private String author; 28 | 29 | @ForeignCollectionField 30 | private ForeignCollection addresses; 31 | public Collection nonDaoAddresses; 32 | 33 | @ForeignCollectionField 34 | private ForeignCollection contacts; 35 | public Collection nonDaoContacts; 36 | 37 | @Override 38 | public void setName(String name) { 39 | this.name = name; 40 | } 41 | 42 | @Override 43 | public String getName() { 44 | return name; 45 | } 46 | 47 | @Override 48 | public void setAuthor(String author) { 49 | this.author = author; 50 | } 51 | 52 | @Override 53 | public void setAddresses(Collection addresses) { 54 | if (addresses instanceof ForeignCollection) { 55 | this.addresses = (ForeignCollection) addresses; 56 | } else { 57 | this.nonDaoAddresses = addresses; 58 | } 59 | } 60 | 61 | /** 62 | * We have to do this separate step because OrmLite doesn't automatically insert children 63 | */ 64 | public void insertNewAddresses(Dao addressBookDao, Dao addressItemDao) throws SQLException { 65 | if (this.nonDaoAddresses == null) { 66 | return; 67 | } 68 | // addressBookDao.assignEmptyForeignCollection(this, "addresses"); 69 | for (AddressItem addressItem : nonDaoAddresses) { 70 | // addressItem.setAddressBook(this); 71 | addressItemDao.create(addressItem); 72 | // addresses.add(addressItem); 73 | } 74 | } 75 | 76 | @Override 77 | public Collection getAddresses() { 78 | return addresses; 79 | } 80 | 81 | @Override 82 | public Collection getContacts() { 83 | return contacts; 84 | } 85 | 86 | public void setContacts(Collection contacts) { 87 | if (contacts instanceof ForeignCollection) { 88 | this.contacts = (ForeignCollection) contacts; 89 | } else { 90 | this.nonDaoContacts = contacts; 91 | } 92 | } 93 | 94 | 95 | /** 96 | * We have to do this separate step because OrmLite doesn't automatically insert children 97 | */ 98 | public void insertNewContacts(Dao addressBookDao, Dao contactDao) throws SQLException { 99 | if (this.nonDaoContacts == null) { 100 | return; 101 | } 102 | // addressBookDao.assignEmptyForeignCollection(this, "contacts"); 103 | for (Contact contact : nonDaoContacts) { 104 | // contact.setAddressBook(this); 105 | contactDao.create(contact); 106 | // contacts.add(contact); 107 | } 108 | } 109 | 110 | @Override 111 | public void saveAll() { 112 | 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ormlite/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ormlite; 2 | 3 | 4 | import com.j256.ormlite.field.DatabaseField; 5 | import com.j256.ormlite.table.DatabaseTable; 6 | 7 | /** 8 | * Description: Address Item DAO 9 | */ 10 | @DatabaseTable(tableName = "AddressItem") 11 | public class AddressItem extends SimpleAddressItem { 12 | 13 | @DatabaseField(foreign=true,foreignAutoRefresh=true) 14 | private AddressBook addressBook; 15 | 16 | @Override 17 | public void setAddressBook(AddressBook addressBook) { 18 | this.addressBook = addressBook; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ormlite/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ormlite; 2 | 3 | import com.j256.ormlite.field.DatabaseField; 4 | import com.j256.ormlite.table.DatabaseTable; 5 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 6 | 7 | /** 8 | * Description: Contact DAO 9 | */ 10 | @DatabaseTable(tableName = "contact") 11 | public class Contact implements IContact { 12 | 13 | @DatabaseField(generatedId = true) 14 | private int id; 15 | 16 | @DatabaseField 17 | private String name; 18 | 19 | @DatabaseField 20 | private String email; 21 | 22 | @DatabaseField(foreign=true,foreignAutoRefresh=true) 23 | private AddressBook addressBook; 24 | 25 | @Override 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | @Override 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | 35 | @Override 36 | public String getEmail() { 37 | return email; 38 | } 39 | 40 | @Override 41 | public void setEmail(String email) { 42 | this.email = email; 43 | } 44 | 45 | @Override 46 | public AddressBook getAddressBookField() { 47 | return addressBook; 48 | } 49 | 50 | @Override 51 | public void setAddressBook(AddressBook addressBook) { 52 | this.addressBook = addressBook; 53 | } 54 | 55 | @Override 56 | public void saveAll() { 57 | 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/ormlite/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.ormlite; 2 | 3 | import com.j256.ormlite.field.DatabaseField; 4 | import com.j256.ormlite.table.DatabaseTable; 5 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 6 | 7 | /** 8 | * Description: 9 | */ 10 | @DatabaseTable(tableName = "SimpleAddressItem") 11 | public class SimpleAddressItem implements IAddressItem { 12 | 13 | @DatabaseField(generatedId = true) 14 | private int id; 15 | 16 | @DatabaseField 17 | private String name; 18 | 19 | @DatabaseField 20 | private String address; 21 | 22 | @DatabaseField 23 | private String city; 24 | 25 | @DatabaseField 26 | private String state; 27 | 28 | @DatabaseField 29 | private long phone; 30 | 31 | 32 | @Override 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | @Override 38 | public void setAddress(String address) { 39 | this.address = address; 40 | } 41 | 42 | @Override 43 | public void setCity(String city) { 44 | this.city = city; 45 | } 46 | 47 | @Override 48 | public void setState(String state) { 49 | this.state = state; 50 | } 51 | 52 | @Override 53 | public void setPhone(long phone) { 54 | this.phone = phone; 55 | } 56 | 57 | @Override 58 | public void setAddressBook(AddressBook addressBook) { 59 | 60 | } 61 | 62 | @Override 63 | public String getName() { 64 | return name; 65 | } 66 | 67 | @Override 68 | public void saveAll() { 69 | 70 | } 71 | 72 | @Override 73 | public long getPhone() { 74 | return phone; 75 | } 76 | 77 | @Override 78 | public String getAddress() { 79 | return address; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/realm/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.realm; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 4 | 5 | import java.util.Collection; 6 | 7 | import io.realm.RealmList; 8 | import io.realm.RealmObject; 9 | 10 | /** 11 | * Description: 12 | */ 13 | public class AddressBook extends RealmObject implements IAddressBook { 14 | 15 | private String name; 16 | 17 | private String author; 18 | 19 | private RealmList addresses; 20 | 21 | private RealmList contacts; 22 | 23 | public AddressBook() { 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public String getAuthor() { 31 | return author; 32 | } 33 | 34 | public void setAddresses(RealmList addresses) { 35 | this.addresses = addresses; 36 | } 37 | 38 | public void setContacts(RealmList contacts) { 39 | this.contacts = contacts; 40 | } 41 | 42 | @Override 43 | public void setName(String name) { 44 | this.name = name; 45 | } 46 | 47 | @Override 48 | public void setAuthor(String author) { 49 | this.author = author; 50 | } 51 | 52 | @Override 53 | public void setAddresses(Collection addresses) { 54 | this.addresses = new RealmList<>(); 55 | for (AddressItem addr : addresses) { 56 | this.addresses.add(addr); 57 | } 58 | } 59 | 60 | @Override 61 | public void setContacts(Collection contacts) { 62 | this.contacts = new RealmList<>(); 63 | for (Contact contact : contacts) { 64 | this.contacts.add(contact); 65 | } 66 | } 67 | 68 | @Override 69 | public Collection getAddresses() { 70 | return addresses; 71 | } 72 | 73 | @Override 74 | public Collection getContacts() { 75 | return contacts; 76 | } 77 | 78 | @Override 79 | public void saveAll() { 80 | 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/realm/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.realm; 2 | 3 | 4 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 5 | 6 | import io.realm.RealmObject; 7 | 8 | public class AddressItem extends RealmObject implements IAddressItem { 9 | private String name; 10 | private String address; 11 | private String city; 12 | private String state; 13 | private long phone; 14 | private AddressBook addressBook; 15 | 16 | public AddressItem() { 17 | } 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public String getAddress() { 24 | return address; 25 | } 26 | 27 | public String getCity() { 28 | return city; 29 | } 30 | 31 | public String getState() { 32 | return state; 33 | } 34 | 35 | public long getPhone() { 36 | return phone; 37 | } 38 | 39 | public AddressBook getAddressBook() { 40 | return addressBook; 41 | } 42 | 43 | @Override 44 | public void setName(String name) { 45 | this.name = name; 46 | } 47 | 48 | @Override 49 | public void setAddress(String address) { 50 | this.address = address; 51 | } 52 | 53 | @Override 54 | public void setCity(String city) { 55 | this.city = city; 56 | } 57 | 58 | @Override 59 | public void setState(String state) { 60 | this.state = state; 61 | } 62 | 63 | @Override 64 | public void setPhone(long phone) { 65 | this.phone = phone; 66 | } 67 | 68 | @Override 69 | public void setAddressBook(AddressBook addressBook) { 70 | this.addressBook = addressBook; 71 | } 72 | 73 | @Override 74 | public void saveAll() { 75 | 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/realm/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.realm; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | 5 | import io.realm.RealmObject; 6 | 7 | /** 8 | * Description: 9 | */ 10 | public class Contact extends RealmObject implements IContact { 11 | 12 | private String name; 13 | 14 | private String email; 15 | 16 | private AddressBook addressBook; 17 | 18 | public Contact() { 19 | } 20 | 21 | public AddressBook getAddressBook() { 22 | return addressBook; 23 | } 24 | 25 | @Override 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | @Override 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | 35 | @Override 36 | public String getEmail() { 37 | return email; 38 | } 39 | 40 | @Override 41 | public void setEmail(String email) { 42 | this.email = email; 43 | } 44 | 45 | @Override 46 | public AddressBook getAddressBookField() { 47 | return getAddressBook(); 48 | } 49 | 50 | @Override 51 | public void setAddressBook(AddressBook addressBook) { 52 | this.addressBook = addressBook; 53 | } 54 | 55 | @Override 56 | public void saveAll() { 57 | 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/realm/RealmTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.realm; 2 | 3 | 4 | import com.raizlabs.android.databasecomparison.Generator; 5 | import com.raizlabs.android.databasecomparison.MainActivity; 6 | import com.raizlabs.android.databasecomparison.Verificator; 7 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 8 | 9 | import java.util.Collection; 10 | 11 | import de.greenrobot.event.EventBus; 12 | import io.realm.Realm; 13 | import io.realm.RealmResults; 14 | 15 | 16 | public class RealmTester { 17 | public static final String FRAMEWORK_NAME = "Realm"; 18 | 19 | public static void testAddressBooks() { 20 | Realm realm = Realm.getDefaultInstance(); 21 | realm.executeTransaction(new Realm.Transaction() { 22 | @Override 23 | public void execute(Realm realm) { 24 | realm.clear(AddressItem.class); 25 | realm.clear(AddressBook.class); 26 | realm.clear(Contact.class); 27 | } 28 | }); 29 | 30 | final Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, true); 31 | 32 | long startTime = System.currentTimeMillis(); 33 | realm.executeTransaction(new Realm.Transaction() { 34 | @Override 35 | public void execute(Realm realm) { 36 | realm.copyToRealm(addressBooks); 37 | } 38 | }); 39 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 40 | realm.close(); 41 | } 42 | 43 | public static void testAddressItems() { 44 | Realm realm = Realm.getDefaultInstance(); 45 | realm.executeTransaction(new Realm.Transaction() { 46 | @Override 47 | public void execute(Realm realm) { 48 | realm.clear(SimpleAddressItem.class); 49 | } 50 | }); 51 | 52 | final Collection addresses = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 53 | 54 | long startTime = System.currentTimeMillis(); 55 | realm.executeTransaction(new Realm.Transaction() { 56 | @Override 57 | public void execute(Realm realm) { 58 | realm.copyToRealm(addresses); 59 | } 60 | }); 61 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 62 | realm.close(); 63 | } 64 | 65 | public static void testAddressBooksRead() { 66 | Realm realm = Realm.getDefaultInstance(); 67 | 68 | long startTime = System.currentTimeMillis(); 69 | RealmResults addressBooks = realm.where(AddressBook.class).findAll(); 70 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 71 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 72 | realm.close(); 73 | } 74 | 75 | public static void testAddressItemsRead() { 76 | Realm realm = Realm.getDefaultInstance(); 77 | 78 | long startTime = System.currentTimeMillis(); 79 | RealmResults addressItems = realm.where(SimpleAddressItem.class).findAll(); 80 | Verificator.verifySimple(FRAMEWORK_NAME, addressItems); 81 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 82 | realm.close(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/realm/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.realm; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | 5 | import io.realm.RealmObject; 6 | 7 | /** 8 | * Description: 9 | */ 10 | public class SimpleAddressItem extends RealmObject implements IAddressItem { 11 | 12 | private String name; 13 | 14 | private String address; 15 | 16 | private String city; 17 | 18 | private String state; 19 | 20 | private long phone; 21 | 22 | public SimpleAddressItem() { 23 | } 24 | 25 | public String getName() { 26 | return name; 27 | } 28 | 29 | public String getAddress() { 30 | return address; 31 | } 32 | 33 | public String getCity() { 34 | return city; 35 | } 36 | 37 | public String getState() { 38 | return state; 39 | } 40 | 41 | public long getPhone() { 42 | return phone; 43 | } 44 | 45 | @Override 46 | public void setName(String name) { 47 | this.name = name; 48 | } 49 | 50 | @Override 51 | public void setAddress(String address) { 52 | this.address = address; 53 | } 54 | 55 | @Override 56 | public void setCity(String city) { 57 | this.city = city; 58 | } 59 | 60 | @Override 61 | public void setState(String state) { 62 | this.state = state; 63 | } 64 | 65 | @Override 66 | public void setPhone(long phone) { 67 | this.phone = phone; 68 | } 69 | 70 | @Override 71 | public void setAddressBook(AddressBook addressBook) { 72 | 73 | } 74 | 75 | @Override 76 | public void saveAll() { 77 | 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sprinkles/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sprinkles; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 4 | 5 | import java.util.Collection; 6 | 7 | import se.emilsjolander.sprinkles.Model; 8 | import se.emilsjolander.sprinkles.Query; 9 | import se.emilsjolander.sprinkles.Transaction; 10 | import se.emilsjolander.sprinkles.annotations.AutoIncrement; 11 | import se.emilsjolander.sprinkles.annotations.Column; 12 | import se.emilsjolander.sprinkles.annotations.Key; 13 | import se.emilsjolander.sprinkles.annotations.Table; 14 | 15 | /** 16 | * Description: 17 | */ 18 | @Table("AddressBook") 19 | public class AddressBook extends Model implements IAddressBook{ 20 | 21 | @Column("id") 22 | @AutoIncrement 23 | @Key 24 | private long id; 25 | 26 | @Column("name") 27 | private String name; 28 | 29 | @Column("author") 30 | private String author; 31 | 32 | Collection addresses; 33 | 34 | Collection contacts; 35 | 36 | @Override 37 | public void setName(String name) { 38 | this.name = name; 39 | } 40 | 41 | @Override 42 | public String getName() { 43 | return name; 44 | } 45 | 46 | @Override 47 | public void setAuthor(String author) { 48 | this.author = author; 49 | } 50 | 51 | @Override 52 | public void setAddresses(Collection addresses) { 53 | this.addresses = addresses; 54 | } 55 | 56 | @Override 57 | public Collection getAddresses() { 58 | if (addresses == null) { 59 | addresses = Query.many(AddressItem.class, "select * from AddressItem where addressBook=?", String.valueOf(id)).get().asList(); 60 | } 61 | return addresses; 62 | } 63 | 64 | @Override 65 | public Collection getContacts() { 66 | if (contacts == null) { 67 | contacts = Query.many(Contact.class, "select * from Contact where addressBook=?", String.valueOf(id)).get().asList(); 68 | } 69 | return contacts; 70 | } 71 | 72 | public long getId() { 73 | return id; 74 | } 75 | 76 | @Override 77 | public void setContacts(Collection contacts) { 78 | this.contacts = contacts; 79 | } 80 | 81 | @Override 82 | public void saveAll() { 83 | 84 | } 85 | 86 | public void saveAll(Transaction transaction) { 87 | super.save(transaction); 88 | for (AddressItem addressItem : addresses) { 89 | addressItem.setAddressBook(this); 90 | addressItem.save(transaction); 91 | } 92 | for (Contact contact : contacts) { 93 | contact.setAddressBook(this); 94 | contact.save(transaction); 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sprinkles/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sprinkles; 2 | 3 | import se.emilsjolander.sprinkles.annotations.Column; 4 | import se.emilsjolander.sprinkles.annotations.Table; 5 | 6 | /** 7 | * Description: 8 | */ 9 | @Table("AddressItem") 10 | public class AddressItem extends SimpleAddressItem { 11 | 12 | @Column("addressBook") 13 | private long addressBook_id; 14 | 15 | @Override 16 | public void setAddressBook(AddressBook addressBook) { 17 | this.addressBook_id = addressBook.getId(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sprinkles/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sprinkles; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | 5 | import se.emilsjolander.sprinkles.Model; 6 | import se.emilsjolander.sprinkles.Query; 7 | import se.emilsjolander.sprinkles.annotations.AutoIncrement; 8 | import se.emilsjolander.sprinkles.annotations.Column; 9 | import se.emilsjolander.sprinkles.annotations.Key; 10 | import se.emilsjolander.sprinkles.annotations.Table; 11 | 12 | /** 13 | * Description: 14 | */ 15 | @Table("contact") 16 | public class Contact extends Model implements IContact{ 17 | 18 | @Column("id") 19 | @AutoIncrement 20 | @Key 21 | private long id; 22 | 23 | @Column("name") 24 | private String name; 25 | 26 | @Column("email") 27 | private String email; 28 | 29 | @Column("addressBook") 30 | private long addressBook_id; 31 | 32 | @Override 33 | public String getName() { 34 | return name; 35 | } 36 | 37 | @Override 38 | public void setName(String name) { 39 | this.name = name; 40 | } 41 | 42 | @Override 43 | public String getEmail() { 44 | return email; 45 | } 46 | 47 | @Override 48 | public void setEmail(String email) { 49 | this.email = email; 50 | } 51 | 52 | @Override 53 | public AddressBook getAddressBookField() { 54 | return Query.one(AddressBook.class, "select * from AddressBook where id = ? limit 1" , addressBook_id).get(); 55 | } 56 | 57 | @Override 58 | public void setAddressBook(AddressBook addressBook) { 59 | this.addressBook_id = addressBook.getId(); 60 | } 61 | 62 | @Override 63 | public void saveAll() { 64 | super.save(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sprinkles/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sprinkles; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | 5 | import se.emilsjolander.sprinkles.Model; 6 | import se.emilsjolander.sprinkles.annotations.AutoIncrement; 7 | import se.emilsjolander.sprinkles.annotations.Column; 8 | import se.emilsjolander.sprinkles.annotations.Key; 9 | import se.emilsjolander.sprinkles.annotations.Table; 10 | 11 | /** 12 | * Description: 13 | */ 14 | @Table("SimpleAddressItem") 15 | public class SimpleAddressItem extends Model implements IAddressItem { 16 | 17 | @Column("id") 18 | @AutoIncrement 19 | @Key 20 | private long id; 21 | 22 | @Column("name") 23 | private String name; 24 | 25 | @Column("address") 26 | private String address; 27 | 28 | @Column("city") 29 | private String city; 30 | 31 | @Column("state") 32 | private String state; 33 | 34 | @Column("phone") 35 | private long phone; 36 | 37 | @Override 38 | public void setName(String name) { 39 | this.name = name; 40 | } 41 | 42 | @Override 43 | public void setAddress(String address) { 44 | this.address = address; 45 | } 46 | 47 | @Override 48 | public void setCity(String city) { 49 | this.city = city; 50 | } 51 | 52 | @Override 53 | public void setState(String state) { 54 | this.state = state; 55 | } 56 | 57 | @Override 58 | public void setPhone(long phone) { 59 | this.phone = phone; 60 | } 61 | 62 | @Override 63 | public void setAddressBook(AddressBook addressBook) { 64 | } 65 | 66 | @Override 67 | public String getName() { 68 | return name; 69 | } 70 | 71 | @Override 72 | public long getPhone() { 73 | return phone; 74 | } 75 | 76 | @Override 77 | public String getAddress() { 78 | return address; 79 | } 80 | 81 | @Override 82 | public void saveAll() { 83 | super.save(); 84 | } 85 | 86 | } 87 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sprinkles/SprinklesTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sprinkles; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteOpenHelper; 5 | 6 | import com.raizlabs.android.databasecomparison.Generator; 7 | import com.raizlabs.android.databasecomparison.MainActivity; 8 | import com.raizlabs.android.databasecomparison.Verificator; 9 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 10 | import com.raizlabs.android.databasecomparison.sql.SqlHelper; 11 | 12 | import java.util.Collection; 13 | 14 | import de.greenrobot.event.EventBus; 15 | import se.emilsjolander.sprinkles.Query; 16 | import se.emilsjolander.sprinkles.Transaction; 17 | 18 | 19 | public class SprinklesTester { 20 | public static final String FRAMEWORK_NAME = "Sprinkles"; 21 | 22 | public static void testAddressItems(Context context) { 23 | SQLiteOpenHelper openHelper = new SqlHelper(context, "sprinkles.db", 1, true); 24 | openHelper.getWritableDatabase().delete("SimpleAddressItem", null, null); 25 | 26 | Collection sprinkleModels = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 27 | long startTime = System.currentTimeMillis(); 28 | 29 | Transaction transaction = new Transaction(); 30 | try { 31 | for (SimpleAddressItem model : sprinkleModels) { 32 | model.save(transaction); 33 | } 34 | transaction.setSuccessful(true); 35 | } finally { 36 | transaction.finish(); 37 | } 38 | 39 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 40 | 41 | } 42 | 43 | public static void testAddressBooks(Context context) { 44 | SQLiteOpenHelper openHelper = new SqlHelper(context, "sprinkles.db", 1, true); 45 | openHelper.getWritableDatabase().delete("AddressItem", null, null); 46 | openHelper.getWritableDatabase().delete("Contact", null, null); 47 | openHelper.getWritableDatabase().delete("AddressBook", null, null); 48 | 49 | final Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, false); 50 | 51 | long startTime = System.currentTimeMillis(); 52 | Transaction transaction = new Transaction(); 53 | try { 54 | for (AddressBook book : addressBooks) { 55 | book.saveAll(transaction); 56 | } 57 | transaction.setSuccessful(true); 58 | } finally { 59 | transaction.finish(); 60 | } 61 | 62 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 63 | 64 | } 65 | 66 | public static void testAddressItemsRead(Context context) { 67 | long startTime = System.currentTimeMillis(); 68 | Collection sprinkleModels = Query.all(SimpleAddressItem.class).get().asList(); 69 | Verificator.verifySimple(FRAMEWORK_NAME, sprinkleModels); 70 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 71 | 72 | } 73 | 74 | public static void testAddressBooksRead(Context context) { 75 | long startTime = System.currentTimeMillis(); 76 | Collection addressBooks = Query.all(AddressBook.class).get().asList(); 77 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 78 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 79 | 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sql/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sql; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 4 | 5 | import java.util.Collection; 6 | 7 | /** 8 | * Description: 9 | */ 10 | public class AddressBook implements IAddressBook { 11 | public static final String NAME = AddressBook.class.getSimpleName(); 12 | 13 | long id; 14 | public String name; 15 | public String author; 16 | 17 | Collection addresses; 18 | Collection contacts; 19 | 20 | @Override 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | @Override 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | @Override 31 | public void setAuthor(String author) { 32 | this.author = author; 33 | } 34 | 35 | @Override 36 | public void setAddresses(Collection addresses) { 37 | this.addresses = addresses; 38 | } 39 | 40 | @Override 41 | public Collection getAddresses() { 42 | return addresses; 43 | } 44 | 45 | @Override 46 | public Collection getContacts() { 47 | return contacts; 48 | } 49 | 50 | @Override 51 | public void setContacts(Collection contacts) { 52 | this.contacts = contacts; 53 | } 54 | 55 | @Override 56 | public void saveAll() { 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sql/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sql; 2 | 3 | /** 4 | * Description: 5 | */ 6 | public class AddressItem extends SimpleAddressItem { 7 | public static final String NAME = AddressItem.class.getSimpleName(); 8 | 9 | private AddressBook addressBook; 10 | 11 | @Override 12 | public void setAddressBook(AddressBook addressBook) { 13 | this.addressBook = addressBook; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sql/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sql; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 4 | 5 | /** 6 | * Description: 7 | */ 8 | public class Contact implements IContact { 9 | public static final String NAME = Contact.class.getSimpleName(); 10 | 11 | private String name; 12 | 13 | private String email; 14 | 15 | public AddressBook addressBook; 16 | 17 | @Override 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | @Override 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | @Override 28 | public String getEmail() { 29 | return email; 30 | } 31 | 32 | @Override 33 | public void setEmail(String email) { 34 | this.email = email; 35 | } 36 | 37 | @Override 38 | public AddressBook getAddressBookField() { 39 | return addressBook; 40 | } 41 | 42 | @Override 43 | public void setAddressBook(AddressBook addressBook) { 44 | this.addressBook = addressBook; 45 | } 46 | 47 | @Override 48 | public void saveAll() { 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sql/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sql; 2 | 3 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 4 | 5 | /** 6 | * Description: 7 | */ 8 | public class SimpleAddressItem implements IAddressItem { 9 | public static final String NAME = SimpleAddressItem.class.getSimpleName(); 10 | 11 | public String name; 12 | 13 | public String address; 14 | 15 | public String city; 16 | 17 | public String state; 18 | 19 | public long phone; 20 | 21 | @Override 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | @Override 27 | public void setAddress(String address) { 28 | this.address = address; 29 | } 30 | 31 | @Override 32 | public void setCity(String city) { 33 | this.city = city; 34 | } 35 | 36 | @Override 37 | public void setState(String state) { 38 | this.state = state; 39 | } 40 | 41 | @Override 42 | public void setPhone(long phone) { 43 | this.phone = phone; 44 | } 45 | 46 | @Override 47 | public void setAddressBook(AddressBook addressBook) { 48 | } 49 | 50 | @Override 51 | public String getName() { 52 | return name; 53 | } 54 | 55 | @Override 56 | public void saveAll() { 57 | } 58 | 59 | 60 | @Override 61 | public long getPhone() { 62 | return phone; 63 | } 64 | 65 | @Override 66 | public String getAddress() { 67 | return address; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sql/SqlHelper.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sql; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteOpenHelper; 6 | 7 | public class SqlHelper extends SQLiteOpenHelper { 8 | private static final String DATABASE_NAME = SqlHelper.class.getName() + ".db"; 9 | private static final int DATABASE_VERSION = 1; 10 | String addIdstr = ""; 11 | 12 | public SqlHelper(Context context) { 13 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 14 | } 15 | 16 | public SqlHelper(Context context, String name, int ver, boolean addId) { 17 | super(context, name, null, ver); 18 | if (addId) { 19 | this.addIdstr = "id integer primary key autoincrement, "; 20 | } 21 | } 22 | 23 | @Override 24 | public void onCreate(SQLiteDatabase db) { 25 | String db1 = "drop table IF EXISTS " + SimpleAddressItem.NAME; 26 | String db2 = "drop table IF EXISTS " + AddressBook.NAME; 27 | String db3 = "drop table IF EXISTS " + AddressItem.NAME; 28 | String db4 = "drop table IF EXISTS " + Contact.NAME; 29 | 30 | db.execSQL(db1); 31 | db.execSQL(db2); 32 | db.execSQL(db3); 33 | db.execSQL(db4); 34 | 35 | db1 = "create table " + SimpleAddressItem.NAME + " (addId, 'address' TEXT, 'city' TEXT, 'name' TEXT, 'phone' INTEGER, 'state' TEXT)"; 36 | db3 = "create table " + AddressBook.NAME + " (id integer primary key autoincrement, 'author' TEXT, 'name' TEXT)"; 37 | db2 = "create table " + AddressItem.NAME + " (addId, 'addressBook' INTEGER, 'address' TEXT, 'city' TEXT, 'name' TEXT, 'phone' INTEGER, 'state' TEXT)"; 38 | db4 = "create table " + Contact.NAME + " (addId, 'addressBook' INTEGER, 'email' TEXT, 'name' TEXT)"; 39 | 40 | db1 = db1.replace("addId, ", addIdstr); 41 | db3 = db3.replace("addId, ", addIdstr); 42 | db2 = db2.replace("addId, ", addIdstr); 43 | db4 = db4.replace("addId, ", addIdstr); 44 | 45 | db.execSQL(db1); 46 | db.execSQL(db2); 47 | db.execSQL(db3); 48 | db.execSQL(db4); 49 | 50 | db1 = "create INDEX book_addr_idx ON " + AddressItem.NAME + " (addressBook)"; 51 | db2 = "create INDEX book_cont_idx ON " + Contact.NAME + " (addressBook)"; 52 | db.execSQL(db1); 53 | db.execSQL(db2); 54 | } 55 | 56 | @Override 57 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 58 | onCreate(db); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sugar/AddressBook.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sugar; 2 | 3 | import com.orm.SugarRecord; 4 | import com.orm.dsl.Ignore; 5 | import com.raizlabs.android.databasecomparison.interfaces.IAddressBook; 6 | 7 | import java.util.Collection; 8 | 9 | /** 10 | * Description: 11 | */ 12 | public class AddressBook extends SugarRecord implements IAddressBook { 13 | 14 | private String name; 15 | 16 | private String author; 17 | 18 | @Ignore 19 | Collection addresses; 20 | 21 | @Ignore 22 | Collection contacts; 23 | 24 | @Override 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | @Override 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | @Override 35 | public void setAuthor(String author) { 36 | this.author = author; 37 | } 38 | 39 | @Override 40 | public void setAddresses(Collection addresses) { 41 | this.addresses = addresses; 42 | } 43 | 44 | @Override 45 | public Collection getAddresses() { 46 | if(addresses == null) { 47 | addresses = AddressItem.find(AddressItem.class, "ADDRESS_BOOK = ?", String.valueOf(getId())); 48 | } 49 | return addresses; 50 | } 51 | 52 | @Override 53 | public Collection getContacts() { 54 | if(contacts == null) { 55 | contacts = Contact.find(Contact.class, "ADDRESS_BOOK = ?", String.valueOf(getId())); 56 | } 57 | return contacts; 58 | } 59 | 60 | @Override 61 | public void setContacts(Collection contacts) { 62 | this.contacts = contacts; 63 | } 64 | 65 | @Override 66 | public void saveAll() { 67 | super.save(); 68 | for(AddressItem addressItem : addresses) { 69 | addressItem.saveAll(); 70 | } 71 | for(Contact contact: contacts) { 72 | contact.saveAll(); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sugar/AddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sugar; 2 | 3 | /** 4 | * Description: 5 | */ 6 | public class AddressItem extends SimpleAddressItem { 7 | 8 | private AddressBook addressBook; 9 | 10 | @Override 11 | public void setAddressBook(AddressBook addressBook) { 12 | this.addressBook = addressBook; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sugar/Contact.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sugar; 2 | 3 | import com.orm.SugarRecord; 4 | import com.raizlabs.android.databasecomparison.interfaces.IContact; 5 | 6 | /** 7 | * Description: 8 | */ 9 | public class Contact extends SugarRecord implements IContact { 10 | 11 | private String name; 12 | 13 | private String email; 14 | 15 | public AddressBook addressBook; 16 | 17 | @Override 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | @Override 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | @Override 28 | public String getEmail() { 29 | return email; 30 | } 31 | 32 | @Override 33 | public void setEmail(String email) { 34 | this.email = email; 35 | } 36 | 37 | @Override 38 | public AddressBook getAddressBookField() { 39 | return addressBook; 40 | } 41 | 42 | @Override 43 | public void setAddressBook(AddressBook addressBook) { 44 | this.addressBook = addressBook; 45 | } 46 | 47 | @Override 48 | public void saveAll() { 49 | super.save(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sugar/SimpleAddressItem.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sugar; 2 | 3 | import com.orm.SugarRecord; 4 | import com.raizlabs.android.databasecomparison.interfaces.IAddressItem; 5 | 6 | /** 7 | * Description: 8 | */ 9 | public class SimpleAddressItem extends SugarRecord implements IAddressItem { 10 | 11 | private String name; 12 | 13 | private String address; 14 | 15 | private String city; 16 | 17 | private String state; 18 | 19 | private long phone; 20 | 21 | @Override 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | @Override 27 | public void setAddress(String address) { 28 | this.address = address; 29 | } 30 | 31 | @Override 32 | public void setCity(String city) { 33 | this.city = city; 34 | } 35 | 36 | @Override 37 | public void setState(String state) { 38 | this.state = state; 39 | } 40 | 41 | @Override 42 | public void setPhone(long phone) { 43 | this.phone = phone; 44 | } 45 | 46 | @Override 47 | public void setAddressBook(AddressBook addressBook) { 48 | } 49 | 50 | @Override 51 | public String getName() { 52 | return name; 53 | } 54 | 55 | @Override 56 | public void saveAll() { 57 | super.save(); 58 | } 59 | 60 | 61 | @Override 62 | public long getPhone() { 63 | return phone; 64 | } 65 | 66 | @Override 67 | public String getAddress() { 68 | return address; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/raizlabs/android/databasecomparison/sugar/SugarTester.java: -------------------------------------------------------------------------------- 1 | package com.raizlabs.android.databasecomparison.sugar; 2 | 3 | import com.orm.SugarTransactionHelper; 4 | import com.orm.SugarTransactionHelper.Callback; 5 | import com.raizlabs.android.databasecomparison.Generator; 6 | import com.raizlabs.android.databasecomparison.Verificator; 7 | import com.raizlabs.android.databasecomparison.MainActivity; 8 | import com.raizlabs.android.databasecomparison.Saver; 9 | import com.raizlabs.android.databasecomparison.events.LogTestDataEvent; 10 | 11 | import java.util.Collection; 12 | 13 | import de.greenrobot.event.EventBus; 14 | 15 | /** 16 | * Description: 17 | */ 18 | public class SugarTester { 19 | public static final String FRAMEWORK_NAME = "Sugar"; 20 | 21 | public static void testAddressBooks() { 22 | AddressItem.deleteAll(AddressItem.class); 23 | AddressBook.deleteAll(AddressBook.class); 24 | Contact.deleteAll(Contact.class); 25 | 26 | final Collection addressBooks = Generator.createAddressBooks(AddressBook.class, Contact.class, AddressItem.class, MainActivity.COMPLEX_LOOP_COUNT, true); 27 | 28 | long startTime = System.currentTimeMillis(); 29 | SugarTransactionHelper.doInTransaction(new Callback() { 30 | @Override 31 | public void manipulateInTransaction() { 32 | Saver.saveAll(addressBooks); 33 | } 34 | }); 35 | 36 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 37 | } 38 | 39 | public static void testAddressItems() { 40 | SimpleAddressItem.deleteAll(SimpleAddressItem.class); 41 | 42 | Collection sugarModelList = Generator.getAddresses(SimpleAddressItem.class, MainActivity.SIMPLE_LOOP_COUNT); 43 | 44 | long startTime = System.currentTimeMillis(); 45 | SimpleAddressItem.saveInTx(sugarModelList); 46 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.SAVE_TIME)); 47 | } 48 | 49 | public static void testAddressBooksRead() { 50 | long startTime = System.currentTimeMillis(); 51 | Collection addressBooks = AddressBook.listAll(AddressBook.class); 52 | Verificator.verify(FRAMEWORK_NAME, addressBooks); 53 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 54 | } 55 | 56 | public static void testAddressItemsRead() { 57 | long startTime = System.currentTimeMillis(); 58 | Collection sugarModelList = SimpleAddressItem.listAll(SimpleAddressItem.class); 59 | Verificator.verifySimple(FRAMEWORK_NAME, sugarModelList); 60 | EventBus.getDefault().post(new LogTestDataEvent(startTime, System.currentTimeMillis(), FRAMEWORK_NAME, MainActivity.LOAD_TIME)); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | 17 |