// http://developer.android.com/intl/ja/reference/android/database/sqlite/SQLiteStatement.html private CodeBlock buildBindArgs() { CodeBlock.Builder builder = CodeBlock.builder(); List<ColumnDefinition> columns = schema.getColumnsWithoutAutoId(); for (int i = 0; i < columns.size(); i++) { int n = i + 1; // bind index starts 1 ColumnDefinition c = columns.get(i); TypeName type = c.getUnboxType(); RelationDefinition r = c.getRelation(); boolean nullable = !type.isPrimitive() && c.nullable; if (nullable) { builder.beginControlFlow("if (model.$L != null)", c.name); } if (type.equals(TypeName.BOOLEAN)) { builder.addStatement( "statement.bindLong($L, model.$L ? 1 : 0)", n, c.getColumnGetterExpr()); } else if (Types.looksLikeIntegerType(type)) { builder.addStatement("statement.bindLong($L, model.$L)", n, c.getColumnGetterExpr()); } else if (Types.looksLikeFloatType(type)) { builder.addStatement("statement.bindDouble($L, model.$L)", n, c.getColumnGetterExpr()); } else if (type.equals(Types.ByteArray)) { builder.addStatement("statement.bindBlob($L, model.$L)", n, c.getColumnGetterExpr()); } else if (type.equals(Types.String)) { builder.addStatement("statement.bindString($L, model.$L)", n, c.getColumnGetterExpr()); } else if (r != null && r.relationType.equals(Types.SingleRelation)) { builder.addStatement( "statement.bindLong($L, model.$L.getId())", n, c.getColumnGetterExpr()); } else { builder.addStatement( "statement.bindString($L, conn.getTypeAdapterRegistry().serialize($T.$L.type, model.$L))", n, schema.getSchemaClassName(), c.name, c.getColumnGetterExpr()); } if (nullable) { builder.endControlFlow(); builder.beginControlFlow("else"); builder.addStatement("statement.bindNull($L)", n); builder.endControlFlow(); } } return builder.build(); }
@Override public void onWriteDefinition(TypeSpec.Builder typeBuilder) { typeBuilder.addField( FieldSpec.builder( ClassName.get(String.class), AUTHORITY, Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) .initializer("$S", authority) .build()); int code = 0; for (TableEndpointDefinition endpointDefinition : endpointDefinitions) { for (ContentUriDefinition contentUriDefinition : endpointDefinition.contentUriDefinitions) { typeBuilder.addField( FieldSpec.builder( TypeName.INT, contentUriDefinition.name, Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) .initializer(String.valueOf(code)) .build()); code++; } } FieldSpec.Builder uriField = FieldSpec.builder( ClassNames.URI_MATCHER, URI_MATCHER, Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL); CodeBlock.Builder initializer = CodeBlock.builder() .addStatement("new $T($T.NO_MATCH)", ClassNames.URI_MATCHER, ClassNames.URI_MATCHER) .add("static {\n"); for (TableEndpointDefinition endpointDefinition : endpointDefinitions) { for (ContentUriDefinition contentUriDefinition : endpointDefinition.contentUriDefinitions) { String path; if (contentUriDefinition.path != null) { path = "\"" + contentUriDefinition.path + "\""; } else { path = CodeBlock.builder() .add( "$L.$L.getPath()", contentUriDefinition.elementClassName, contentUriDefinition.name) .build() .toString(); } initializer.addStatement( "$L.addURI($L, $L, $L)", URI_MATCHER, AUTHORITY, path, contentUriDefinition.name); } } initializer.add("}\n"); typeBuilder.addField(uriField.initializer(initializer.build()).build()); typeBuilder.addMethod( MethodSpec.methodBuilder("getDatabaseName") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addStatement("return $S", databaseNameString) .returns(ClassName.get(String.class)) .build()); MethodSpec.Builder getTypeBuilder = MethodSpec.methodBuilder("getType") .addAnnotation(Override.class) .addParameter(ClassNames.URI, "uri") .returns(ClassName.get(String.class)) .addModifiers(Modifier.PUBLIC, Modifier.FINAL); CodeBlock.Builder getTypeCode = CodeBlock.builder() .addStatement("$T type = null", ClassName.get(String.class)) .beginControlFlow("switch($L.match(uri))", URI_MATCHER); for (TableEndpointDefinition tableEndpointDefinition : endpointDefinitions) { for (ContentUriDefinition uriDefinition : tableEndpointDefinition.contentUriDefinitions) { getTypeCode .beginControlFlow("case $L:", uriDefinition.name) .addStatement("type = $S", uriDefinition.type) .addStatement("break") .endControlFlow(); } } getTypeCode .beginControlFlow("default:") .addStatement( "throw new $T($S + $L)", ClassName.get(IllegalArgumentException.class), "Unknown URI", "uri") .endControlFlow(); getTypeCode.endControlFlow(); getTypeCode.addStatement("return type"); getTypeBuilder.addCode(getTypeCode.build()); typeBuilder.addMethod(getTypeBuilder.build()); for (MethodDefinition method : methods) { MethodSpec methodSpec = method.getMethodSpec(); if (methodSpec != null) { typeBuilder.addMethod(methodSpec); } } }