属性,条件和条件组

DBFlow,通过Java注释处理,生成一个_Table表示你的 Model。生成的每个领域都是子类的IProperty。每个的IProperty代表在相应表中的列,并提供了一个类型安全的条件操作把它变成SQLCondition或变异成另一种属性。

SQLCondition是一个代表SQL语句中的条件语句的接口。这是一个接口,这样其他类型的条件可以使用,并且允许最大的灵活性,以满足您的需求。

例如,写在原始的SQLite:

  1. `name` = 'Test'
  2. `name` = `SomeTable`.`Test`
  3. `name` LIKE '%Test%'
  4. `name` != 'Test'
  5. `salary` BETWEEN 15000 AND 40000
  6. `name` IN('Test','Test2','TestN')
  7. ((`name`='Test' AND `rank`=6) OR (`name`='Bob' AND `rank`=8))

如何使用条件

建议我们的查询从Model属性中创造条件

我们有一个简单的表:

  1. @Table(database = TestDatabase.class)
  2. public class TestModel3 {
  3. @PrimaryKey
  4. String name;
  5. @Column
  6. String type;
  7. }

有了这个定义, DBFlow将帮我们生产一个TestModel3_Table类:

  1. public final class TestModel3_Table {
  2. public static final PropertyConverter PROPERTY_CONVERTER = new PropertyConverter(){
  3. public IProperty fromName(String columnName) {
  4. return com.raizlabs.android.dbflow.test.sql.TestModel3_Table.getProperty(columnName);
  5. }
  6. };
  7. public static final Property<String> type = new Property<String>(TestModel3.class, "type");
  8. public static final Property<String> name = new Property<String>(TestModel3.class, "name");
  9. public static final IProperty[] getAllColumnProperties() {
  10. return new IProperty[]{type,name};
  11. }
  12. public static BaseProperty getProperty(String columnName) {
  13. columnName = QueryBuilder.quoteIfNeeded(columnName);
  14. switch (columnName) {
  15. case "`type`": {
  16. return type;
  17. }
  18. case "`name`": {
  19. return name;
  20. }
  21. default: {
  22. throw new IllegalArgumentException("Invalid column name passed. Ensure you are calling the correct table's column");
  23. }
  24. }
  25. }
  26. }

从生成的类文件中使用的字段,我们现在可以在我们的查询中使用属性生成SQLCondition

  1. TestModel3_Table.name.is("Test"); // `name` = 'Test'
  2. TestModel3_Table.name.withTable().is("Test"); // `TestModel3`.`name` = 'Test'
  3. TestModel3_Table.name.like("%Test%");
  4. // `name`=`AnotherTable`.`name`
  5. TestModel3_Table.name.eq(AnotherTable_Table.name);

A whole set of SQLCondition operations are supported for Property generated for a Table including:

  1. is(), eq() -> =
  2. isNot(), notEq() -> !=
  3. isNull() -> IS NULL / isNotNull()IS NOT NULL
  4. like(), glob()
  5. greaterThan(), greaterThanOrEqual(), lessThan(), lessThanOrEqual()
  6. between() -> BETWEEN
  7. in(), notIn()

此外,我们可以做加法和减法:

  1. SomeTable_Table.latitude.plus(SomeTable_Table.longitude).lessThan(45.0); // `latitude` + `longitude` < 45.0
  2. SomeTable_Table.latitude.minus(SomeTable_Table.longitude).greaterThan(45.0); // `latitude` - `longitude` > 45.0

条件组

ConditionGroupConditionQueryBuilder的继任者。这是有缺陷的,就是它符合的QueryBuilder,还包含 Condition,以及所需要的类型的参数都需要属于它自己的表。

ConditionGroup是任意集合 SQLCondition,可以组合成一个单一的条件,SELECT projection,或者被用作SQLCondition在另一个ConditionGroup内。

这用于包装查询语句,支持其他各种查询和类。

  1. SQLite.select()
  2. .from(MyTable.class)
  3. .where(MyTable_Table.someColumn.is("SomeValue"))
  4. .and(MyTable_Table.anotherColumn.is("ThisValue"));
  5. // SELECT * FROM `MyTable` WHERE `someColumn`='OneValue' OR (`someColumn`='SomeValue' AND `anotherColumn`='ThisValue')
  6. SQLite.select()
  7. .from(MyTable.class)
  8. .where(MyTable.someColumn.is("OneValue"))
  9. .or(ConditionGroup.clause()
  10. .and(MyTable_Table.someColumn.is("SomeValue")
  11. .AND(MyTable_Table.anotherColumn.is("ThisValue"));