Skip to content

Commit 38fe8f0

Browse files
authored
Merge pull request #1370 from Raizlabs/develop
4.0.5
2 parents 43dd2f6 + ea8079f commit 38fe8f0

File tree

31 files changed

+208
-140
lines changed

31 files changed

+208
-140
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
![Image](https://github.com/agrosner/DBFlow/blob/develop/dbflow_banner.png?raw=true)
22

3-
[![JitPack.io](https://img.shields.io/badge/JitPack.io-4.0.0-red.svg?style=flat)](https://jitpack.io/#Raizlabs/DBFlow) [![Android Weekly](http://img.shields.io/badge/Android%20Weekly-%23129-2CB3E5.svg?style=flat)](http://androidweekly.net/issues/issue-129) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-DBFlow-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1134)
3+
[![JitPack.io](https://img.shields.io/badge/JitPack.io-4.0.5-red.svg?style=flat)](https://jitpack.io/#Raizlabs/DBFlow) [![Android Weekly](http://img.shields.io/badge/Android%20Weekly-%23129-2CB3E5.svg?style=flat)](http://androidweekly.net/issues/issue-129) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-DBFlow-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1134)
44

55
A robust, powerful, and very simple ORM android database library with **annotation processing**.
66

@@ -41,7 +41,7 @@ Add the library to the project-level build.gradle, using the apt plugin to enabl
4141

4242
```groovy
4343
44-
def dbflow_version = "4.0.4"
44+
def dbflow_version = "4.0.5"
4545
// or dbflow_version = "develop-SNAPSHOT" for grabbing latest dependency in your project on the develop branch
4646
// or 10-digit short-hash of a specific commit. (Useful for bugs fixed in develop, but not in a release yet)
4747
@@ -83,7 +83,7 @@ Add the library to the project-level build.gradle, using the apt plugin to enabl
8383

8484
# Pull Requests
8585
I welcome and encourage all pull requests. It usually will take me within 24-48 hours to respond to any issue or request. Here are some basic rules to follow to ensure timely addition of your request:
86-
1. Match coding style (braces, spacing, etc.) This is best achieved using CMD+Option+L (Reformat code) on Mac (not sure for Windows) with Android Studio defaults.
86+
1. Match coding style (braces, spacing, etc.) This is best achieved using **Reformat Code** shortcut, <kbd>command</kbd>+<kbd>option</kbd>+<kbd>L</kbd> on Mac and <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>L</kbd> on Windows, with Android Studio defaults.
8787
2. If its a feature, bugfix, or anything please only change code to what you specify.
8888
3. Please keep PR titles easy to read and descriptive of changes, this will make them easier to merge :)
8989
4. Pull requests _must_ be made against `develop` branch. Any other branch (unless specified by the maintainers) will get rejected.

build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
buildscript {
2-
ext.kotlin_version = '1.1.2-3'
2+
ext.kotlin_version = '1.1.3-2'
33
repositories {
44
jcenter()
55
}
66
dependencies {
7-
classpath 'com.android.tools.build:gradle:2.3.2'
7+
classpath 'com.android.tools.build:gradle:2.3.3'
88
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
99
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2'
1010
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

dbflow-kotlinextensions/src/main/java/com/raizlabs/android/dbflow/kotlinextensions/ModelExtensions.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ inline fun <reified T : Any> T.delete(databaseWrapper: DatabaseWrapper = writabl
1313

1414
inline fun <reified T : Any> T.exists(databaseWrapper: DatabaseWrapper = writableDatabaseForTable<T>()) = modelAdapter<T>().exists(this, databaseWrapper)
1515

16-
inline fun <reified T : Any> T.async(databaseWrapper: DatabaseWrapper = writableDatabaseForTable<T>()) = AsyncModel(this)
16+
inline fun <reified T : Any> T.async() = AsyncModel(this)

dbflow-kotlinextensions/src/main/java/com/raizlabs/android/dbflow/kotlinextensions/OperatorExtensions.kt

+9
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package com.raizlabs.android.dbflow.kotlinextensions
33
import com.raizlabs.android.dbflow.annotation.Collate
44
import com.raizlabs.android.dbflow.sql.language.NameAlias
55
import com.raizlabs.android.dbflow.sql.language.Operator
6+
import com.raizlabs.android.dbflow.sql.language.OperatorGroup
67
import com.raizlabs.android.dbflow.sql.language.OperatorGroup.clause
78
import com.raizlabs.android.dbflow.sql.language.SQLOperator
89

10+
fun SQLOperator.clause() = OperatorGroup.clause(this)
911

1012
fun <T : Any> NameAlias.op() = Operator.op<T>(this)
1113

@@ -29,3 +31,10 @@ infix fun <T : Any> Operator<T>.andAll(sqlOperator: Collection<SQLOperator>) = c
2931

3032
infix fun <T : Any> Operator<T>.orAll(sqlOperator: Collection<SQLOperator>) = clause(this).orAll(sqlOperator)
3133

34+
infix fun OperatorGroup.and(sqlOperator: SQLOperator) = and(sqlOperator)
35+
36+
infix fun OperatorGroup.or(sqlOperator: SQLOperator) = or(sqlOperator)
37+
38+
infix fun OperatorGroup.and(sqlOperator: OperatorGroup) = clause().and(sqlOperator)
39+
40+
infix fun OperatorGroup.or(sqlOperator: OperatorGroup) = clause().or(sqlOperator)

dbflow-kotlinextensions/src/main/java/com/raizlabs/android/dbflow/kotlinextensions/PropertyExtensions.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.raizlabs.android.dbflow.kotlinextensions
22

3+
import com.raizlabs.android.dbflow.sql.language.property.Property
34
import com.raizlabs.android.dbflow.sql.language.property.PropertyFactory.from
45
import com.raizlabs.android.dbflow.sql.queriable.ModelQueriable
6+
import kotlin.reflect.KClass
57

68
/**
79
* Description: Provides some very nice Property class extensions.
@@ -34,4 +36,6 @@ val <T : Any> T?.property
3436
val <T : Any> ModelQueriable<T>.property
3537
get() = from(this)
3638

37-
inline fun <reified T : Any> propertyString(stringRepresentation: String?) = from(T::class.java, stringRepresentation)
39+
inline fun <reified T : Any> propertyString(stringRepresentation: String?) = from(T::class.java, stringRepresentation)
40+
41+
inline fun <reified T : Any> KClass<T>.allProperty() = Property.allProperty(this.java)

dbflow-processor/src/main/java/com/raizlabs/android/dbflow/processor/ProcessorManager.kt

+22-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,18 @@ package com.raizlabs.android.dbflow.processor
33
import com.google.common.collect.Lists
44
import com.google.common.collect.Maps
55
import com.google.common.collect.Sets
6-
import com.raizlabs.android.dbflow.processor.definition.*
6+
import com.raizlabs.android.dbflow.processor.definition.BaseTableDefinition
7+
import com.raizlabs.android.dbflow.processor.definition.ContentProviderDefinition
8+
import com.raizlabs.android.dbflow.processor.definition.DatabaseDefinition
9+
import com.raizlabs.android.dbflow.processor.definition.DatabaseHolderDefinition
10+
import com.raizlabs.android.dbflow.processor.definition.DatabaseObjectHolder
11+
import com.raizlabs.android.dbflow.processor.definition.ManyToManyDefinition
12+
import com.raizlabs.android.dbflow.processor.definition.MigrationDefinition
13+
import com.raizlabs.android.dbflow.processor.definition.ModelViewDefinition
14+
import com.raizlabs.android.dbflow.processor.definition.QueryModelDefinition
15+
import com.raizlabs.android.dbflow.processor.definition.TableDefinition
16+
import com.raizlabs.android.dbflow.processor.definition.TableEndpointDefinition
17+
import com.raizlabs.android.dbflow.processor.definition.TypeConverterDefinition
718
import com.raizlabs.android.dbflow.processor.utils.WriterUtils
819
import com.squareup.javapoet.ClassName
920
import com.squareup.javapoet.JavaFile
@@ -209,7 +220,7 @@ class ProcessorManager internal constructor(val processingEnvironment: Processin
209220

210221
fun logError(error: String?, vararg args: Any?) = logError(callingClass = null, error = error, args = args)
211222

212-
fun logWarning(error: String, vararg args: Any) {
223+
fun logWarning(error: String?, vararg args: Any) {
213224
messager.printMessage(Diagnostic.Kind.WARNING, String.format("*==========*\n$error\n*==========*", *args))
214225
}
215226

@@ -317,18 +328,16 @@ class ProcessorManager internal constructor(val processingEnvironment: Processin
317328

318329
}
319330

320-
if (roundEnvironment.processingOver()) {
321-
try {
322-
val databaseHolderDefinition = DatabaseHolderDefinition(processorManager)
323-
if (!databaseHolderDefinition.isGarbage()) {
324-
JavaFile.builder(ClassNames.FLOW_MANAGER_PACKAGE,
325-
databaseHolderDefinition.typeSpec).build()
326-
.writeTo(processorManager.processingEnvironment.filer)
327-
}
328-
} catch (e: IOException) {
329-
logError(e.message)
331+
try {
332+
val databaseHolderDefinition = DatabaseHolderDefinition(processorManager)
333+
if (!databaseHolderDefinition.isGarbage()) {
334+
JavaFile.builder(ClassNames.FLOW_MANAGER_PACKAGE,
335+
databaseHolderDefinition.typeSpec).build()
336+
.writeTo(processorManager.processingEnvironment.filer)
330337
}
331-
338+
} catch (e: FilerException) {
339+
} catch (e: IOException) {
340+
logError(e.message)
332341
}
333342
}
334343

dbflow-processor/src/main/java/com/raizlabs/android/dbflow/processor/ProcessorUtils.kt

+5-7
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object ProcessorUtils {
3232
val typeElement = processingEnvironment.elementUtils.getTypeElement(fqTn)
3333
if (typeElement == null) {
3434
processingEnvironment.messager.printMessage(Diagnostic.Kind.ERROR,
35-
"Type Element was null for: $fqTn ensure that the visibility of the class is not private.")
35+
"Type Element was null for: $fqTn ensure that the visibility of the class is not private.")
3636
return false
3737
} else {
3838
val classMirror: TypeMirror? = typeElement.asType().erasure()
@@ -67,14 +67,12 @@ object ProcessorUtils {
6767
}
6868

6969
fun fromTypeMirror(typeMirror: TypeMirror, processorManager: ProcessorManager): ClassName? {
70-
var className: ClassName? = null
7170
val element = getTypeElement(typeMirror)
72-
if (element != null) {
73-
className = ClassName.get(element)
71+
return if (element != null) {
72+
ClassName.get(element)
7473
} else {
75-
className = ElementUtility.getClassName(typeMirror.toString(), processorManager)
74+
ElementUtility.getClassName(typeMirror.toString(), processorManager)
7675
}
77-
return className
7876
}
7977

8078
fun getTypeElement(element: Element): TypeElement? {
@@ -100,7 +98,7 @@ object ProcessorUtils {
10098
fun ensureVisibleStatic(element: Element, typeElement: TypeElement,
10199
name: String) {
102100
if (element.modifiers.contains(Modifier.PRIVATE)
103-
|| element.modifiers.contains(Modifier.PROTECTED)) {
101+
|| element.modifiers.contains(Modifier.PROTECTED)) {
104102
manager.logError("$name must be visible from: " + typeElement)
105103
}
106104
if (!element.modifiers.contains(Modifier.STATIC)) {

dbflow-processor/src/main/java/com/raizlabs/android/dbflow/processor/definition/ModelViewDefinition.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,8 @@ class ModelViewDefinition(manager: ProcessorManager, element: Element) : BaseTab
103103
val columnDefinition = ColumnDefinition(manager, variableElement, this, isPackagePrivateNotInSamePackage)
104104
if (columnValidator.validate(manager, columnDefinition)) {
105105
columnDefinitions.add(columnDefinition)
106-
107106
if (isPackagePrivate) {
108-
columnDefinitions.add(columnDefinition)
107+
packagePrivateList.add(columnDefinition)
109108
}
110109
}
111110

dbflow-processor/src/main/java/com/raizlabs/android/dbflow/processor/definition/TableEndpointDefinition.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class TableEndpointDefinition(typeElement: Element, processorManager: ProcessorM
7171
notifyDefinitionList = arrayListOf()
7272
methodListMap.put(notifyDefinition.method, notifyDefinitionList)
7373
}
74-
notifyDefinitionList!!.add(notifyDefinition)
74+
notifyDefinitionList.add(notifyDefinition)
7575
}
7676
}
7777
}

dbflow-processor/src/main/java/com/raizlabs/android/dbflow/processor/definition/column/ColumnAccessCombiner.kt

+36-23
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,16 @@ abstract class ColumnAccessCombiner(val combiner: Combiner) {
3434
fieldAccess = CodeBlock.of("${nameAllocator.newName(customPrefixName)}ref" + fieldLevelAccessor.propertyName)
3535

3636
if (defineProperty) {
37-
existingBuilder.addStatement("\$T \$L = \$L != null ? \$L : null",
38-
wrapperFieldTypeName, fieldAccess,
39-
fieldLevelAccessor.get(modelBlock),
40-
wrapperLevelAccessor.get(fieldLevelAccessor.get(modelBlock)))
37+
val fieldAccessorBlock = fieldLevelAccessor.get(modelBlock)
38+
val wrapperAccessorBlock = wrapperLevelAccessor.get(fieldAccessorBlock)
39+
// if same, don't extra null check.
40+
if (fieldLevelAccessor.toString() != wrapperLevelAccessor.toString()) {
41+
existingBuilder.addStatement("\$T \$L = \$L != null ? \$L : null",
42+
wrapperFieldTypeName, fieldAccess, fieldAccessorBlock, wrapperAccessorBlock)
43+
} else {
44+
existingBuilder.addStatement("\$T \$L = \$L", wrapperFieldTypeName,
45+
fieldAccess, fieldAccessorBlock)
46+
}
4147
}
4248
} else {
4349
if (useWrapper && wrapperLevelAccessor != null) {
@@ -101,9 +107,9 @@ class ExistenceAccessCombiner(combiner: Combiner,
101107
}
102108

103109
add("\$T.selectCountOf()\n.from(\$T.class)\n" +
104-
".where(getPrimaryConditionClause(\$L))\n" +
105-
".hasData(wrapper)",
106-
ClassNames.SQLITE, tableClassName, modelBlock)
110+
".where(getPrimaryConditionClause(\$L))\n" +
111+
".hasData(wrapper)",
112+
ClassNames.SQLITE, tableClassName, modelBlock)
107113
}
108114
add(";\n")
109115
}
@@ -128,11 +134,18 @@ class ContentValuesCombiner(combiner: Combiner)
128134
if (subWrapperAccessor != null) {
129135
subWrapperFieldAccess = subWrapperAccessor.get(storedFieldAccess)
130136
}
131-
statement("values.put(\$S, \$L != null ? \$L : \$L)",
132-
QueryBuilder.quote(columnRepresentation), storedFieldAccess, subWrapperFieldAccess, defaultValue)
137+
if (storedFieldAccess.toString() != subWrapperFieldAccess.toString()
138+
|| defaultValue.toString() != "null") {
139+
statement("values.put(\$S, \$L != null ? \$L : \$L)",
140+
QueryBuilder.quote(columnRepresentation), storedFieldAccess, subWrapperFieldAccess, defaultValue)
141+
} else {
142+
// if same default value is null and object reference is same as subwrapper.
143+
statement("values.put(\$S, \$L)",
144+
QueryBuilder.quote(columnRepresentation), storedFieldAccess)
145+
}
133146
} else {
134147
statement("values.put(\$S, \$L)",
135-
QueryBuilder.quote(columnRepresentation), fieldAccess)
148+
QueryBuilder.quote(columnRepresentation), fieldAccess)
136149
}
137150
}
138151
}
@@ -150,7 +163,7 @@ class SqliteStatementAccessCombiner(combiner: Combiner)
150163
modelBlock: CodeBlock, defineProperty: Boolean) {
151164
combiner.apply {
152165
val fieldAccess: CodeBlock = getFieldAccessBlock(this@addCode, modelBlock,
153-
defineProperty = defineProperty)
166+
defineProperty = defineProperty)
154167
val wrapperMethod = SQLiteHelper.getWrapperMethod(wrapperFieldTypeName ?: fieldTypeName)
155168
val statementMethod = SQLiteHelper[fieldTypeName].sqLiteStatementMethod
156169

@@ -205,30 +218,30 @@ class LoadFromCursorAccessCombiner(combiner: Combiner,
205218
if (!orderedCursorLookup) {
206219
indexName = CodeBlock.of(nameAllocator.newName("index_$columnRepresentation", columnRepresentation))
207220
statement("\$T \$L = cursor.getColumnIndex(\$S)", Int::class.java, indexName,
208-
columnRepresentation)
221+
columnRepresentation)
209222
beginControlFlow("if (\$1L != -1 && !cursor.isNull(\$1L))", indexName)
210223
} else {
211224
beginControlFlow("if (!cursor.isNull(\$1L))", index)
212225
}
213226
val cursorAccess = CodeBlock.of("cursor.\$L(\$L)",
214-
SQLiteHelper.getMethod(wrapperFieldTypeName ?: fieldTypeName), indexName)
227+
SQLiteHelper.getMethod(wrapperFieldTypeName ?: fieldTypeName), indexName)
215228
// special case where we need to append try catch hack
216229
val isEnum = wrapperLevelAccessor is EnumColumnAccessor
217230
if (isEnum) {
218231
beginControlFlow("try")
219232
}
220233
if (subWrapperAccessor != null) {
221234
statement(fieldLevelAccessor.set(
222-
wrapperLevelAccessor.set(subWrapperAccessor.set(cursorAccess)), modelBlock))
235+
wrapperLevelAccessor.set(subWrapperAccessor.set(cursorAccess)), modelBlock))
223236
} else {
224237
statement(fieldLevelAccessor.set(
225-
wrapperLevelAccessor.set(cursorAccess), modelBlock))
238+
wrapperLevelAccessor.set(cursorAccess), modelBlock))
226239
}
227240
if (isEnum) {
228241
catch(IllegalArgumentException::class) {
229242
if (assignDefaultValuesFromCursor) {
230243
statement(fieldLevelAccessor.set(wrapperLevelAccessor.set(defaultValue,
231-
isDefault = true), modelBlock))
244+
isDefault = true), modelBlock))
232245
} else {
233246
statement(fieldLevelAccessor.set(defaultValue, modelBlock))
234247
}
@@ -237,7 +250,7 @@ class LoadFromCursorAccessCombiner(combiner: Combiner,
237250
if (assignDefaultValuesFromCursor) {
238251
nextControlFlow("else")
239252
statement(fieldLevelAccessor.set(wrapperLevelAccessor.set(defaultValue,
240-
isDefault = true), modelBlock))
253+
isDefault = true), modelBlock))
241254
}
242255
endControlFlow()
243256
} else {
@@ -249,7 +262,7 @@ class LoadFromCursorAccessCombiner(combiner: Combiner,
249262
hasDefault = true // force a null on it.
250263
}
251264
val cursorAccess = CodeBlock.of("cursor.\$LOrDefault(\$L${if (hasDefault) ", $defaultValueBlock" else ""})",
252-
SQLiteHelper.getMethod(wrapperFieldTypeName ?: fieldTypeName), indexName)
265+
SQLiteHelper.getMethod(wrapperFieldTypeName ?: fieldTypeName), indexName)
253266
statement(fieldLevelAccessor.set(cursorAccess, modelBlock))
254267
}
255268
}
@@ -263,13 +276,13 @@ class PrimaryReferenceAccessCombiner(combiner: Combiner)
263276
modelBlock: CodeBlock, defineProperty: Boolean) {
264277
val wrapperLevelAccessor = this@PrimaryReferenceAccessCombiner.combiner.wrapperLevelAccessor
265278
statement("clause.and(\$L.\$Leq(\$L))", columnRepresentation,
266-
if (!wrapperLevelAccessor.isPrimitiveTarget()) "invertProperty()." else "",
267-
getFieldAccessBlock(this, modelBlock, wrapperLevelAccessor !is BooleanColumnAccessor))
279+
if (!wrapperLevelAccessor.isPrimitiveTarget()) "invertProperty()." else "",
280+
getFieldAccessBlock(this, modelBlock, wrapperLevelAccessor !is BooleanColumnAccessor))
268281
}
269282

270283
override fun addNull(code: CodeBlock.Builder, columnRepresentation: String, index: Int) {
271284
code.addStatement("clause.and(\$L.eq((\$T) \$L))", columnRepresentation,
272-
ClassNames.ICONDITIONAL, "null")
285+
ClassNames.ICONDITIONAL, "null")
273286
}
274287
}
275288

@@ -311,7 +324,7 @@ class SaveModelAccessCombiner(combiner: Combiner,
311324
statement("$access.save(${wrapperIfBaseModel(extendsBaseModel)})")
312325
} else {
313326
statement("\$T.getModelAdapter(\$T.class).save($access, ${ModelUtils.wrapper})",
314-
ClassNames.FLOW_MANAGER, fieldTypeName)
327+
ClassNames.FLOW_MANAGER, fieldTypeName)
315328
}
316329
}.end()
317330
}
@@ -332,7 +345,7 @@ class DeleteModelAccessCombiner(combiner: Combiner,
332345
statement("$access.delete(${wrapperIfBaseModel(extendsBaseModel)})")
333346
} else {
334347
statement("\$T.getModelAdapter(\$T.class).delete($access, ${ModelUtils.wrapper})",
335-
ClassNames.FLOW_MANAGER, fieldTypeName)
348+
ClassNames.FLOW_MANAGER, fieldTypeName)
336349
}
337350
}.end()
338351
}

0 commit comments

Comments
 (0)