表格和数据库属性
创建数据库
用DBFlow创建数据库是超级简单的。只要简单地定义一个占位符 @Database 类:
2. @Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
3. public class AppDatabase {
5. public static final String NAME = "AppDatabase";
7. public static final int VERSION = 1;
8. }
P.S. 你可以定义为许多@Database 只要你喜欢,但是名称要唯一的。
预包装数据库
如果想为你得app包含预先准备好的数据库,直接把 “.db” 文件复制到src/main/assets/{databaseName}.db目录中。在创建数据库时,我们复制该文件给应用使用。由于这是APK内预先包装,在复制完后,我们无法将其删除,导致APK变大(取决于数据库文件大小)。
配置属性
全局冲突处理:在这里通过指定insertConflict()和 updateConflict(),任何 @Table没有明确定上面2个属性的任意一个,他将会使用最适合的一个关联@Database。
以前,你需要定义一个generatedClassSeparator() 才能运行。
如果要更改默认_ ,只需添加一些字符串:
2. @Database(generatedClassSeparator = "$$")
开放数据库的完整性检查:每当打开数据,consistencyChecksEnabled() 将运行一个PRAGMA quick_check(1),如果失败,它将尝试复制预先打包的数据库。
轻松备份数据库:backupEnabled() 调用,可以备份数据库
1. FlowManager.getDatabaseForTable(table).backupDB()
请注意:当数据库备份失败时,这将创建一个临时的第三方数据库。
打开外键Constrants:通过设置foreignKeysSupported()=true ,让数据库强制执行外键。默认情况下此处于关闭状态。们仍然可以定义@ForeignKey,但他们的关系不执行。
OpenHelper的定义实现:他们必须为FlowSQLiteOpenHelper配置构造参数:
1. public FlowSQLiteOpenHelper(BaseDatabaseDefinition flowManager, DatabaseHelperListener listener)
要 public,并在 @Database 注解中指出了 sqlHelperClass() 自定义类。
模型与创造
所有标准表必须使用@Table 注解和实现Model接口。为方便起见,BaseModel提供了一个默认的实现。
Model的支持:
- Fields: 支持任何默认Java类型.
类型转换器: 您可以定义非标准类的列,如Date,Calendar等,这些可以在列逐列的基础上进行配置。- 复合
@PrimaryKey - 复合
@ForeignKey. 嵌套Model,ModelContainer,ForeignKeyContaineror standard@Column. - 结合
@PrimaryKey和@ForeignKey, 以及那些可以有复杂的主键。 - 内部类
Models的规则和技巧:
1.Model必须有一个可访问的默认构造函数。这可以是public或package private.。
- 子类是完全支持。DBFlow将收集并结合每个子类“的注释并将它们组合为当前类。
- 字段可以是public,package private(我们生成package helpers访问),或private(要有getter和setter)。Private fields需要有一个getter
get{Name}和setterset{Name}。这些也可以被配置。 - 我们可以继承非
Model的类,这样类可以通过扩展inheritedColumns()(或inheritedPrimaryKeys())。这些都必须通过带有对应的getter和setter的 package-private, public, or private - 结合
@PrimaryKey和@ForeignKey, 以及那些可以有复杂的主键。 - 要启用缓存,设置
cachingEnabled = true,这将加快在大多数情况下检索。
简单例子
这是一个带有一个主键(一个Model最少有一个)和其他列的 Model。
1. @Table(database = AppDatabase.class)
2. public class TestModel extends BaseModel {
4. // All tables must have a least one primary key
5. @PrimaryKey
6. String name;
8. // By default the column name is the field name
9. @Column
10. int randomNumber;
12. }
高级表功能
为特定的列自定义类型转换器
在3.0,现在您可以为特定@Column指定一个TypeConverter,为转换器指定对应的Column :
2. @Column(typeConverter = SomeTypeConverter.class)
3. SomeObject someObject;
它将取代通常的转换/访问方法(除如果该字段是私有的,它保留了基于私有访问方法)。
所有字段作为列
因为其他库也这样做,你可以设置 @Table(allFields = true) 打开使用所有的public/package private,non-final,,以及non-static 字段作为 @Column。你仍然需要提供至少一个 @PrimaryKey 字段。
如果您需要忽略一个字段,使用 @ColumnIgnore 注释。
私人列
如果你想使用私有字段,只需指定一个getter和setter,格式:name -> getName() + setName(columnFieldType)
2. @Table(database = TestDatabase.class)
3. public class PrivateModelTest extends BaseModel {
5. @PrimaryKey
6. private String name;
9. public String getName() {
10. return name;
11. }
13. public void setName(String name) {
14. this.name = name;
15. }
16. }
boolean fields can use “is”
2. @Table(database = TestDatabase.class, useIsForPrivateBooleans = true)
3. public class PrivateModelTest extends BaseModel {
5. @PrimaryKey
6. private String name;
8. @Column
9. private boolean selected;
11. public boolean isSelected() {
12. return selected;
13. }
15. public void setSelected(boolean selected) {
16. this.selected = selected;
17. }
19. //... etc
20. }
默认值
当字段的值丢失或遗漏,希望提供在数据库中默认值。SQLite使用DEFAULT来实现。
然而,在DBFlow也不是那么容易,因为我们依靠预编译实现这个INSERT声明。因此,作为一种妥协,这些值插入这样:
1. @Table(database = TestDatabase.class)
2. public class DefaultModel extends TestModel1 {
4. @Column(defaultValue = "55")
5. Integer count;
7. }
In the _Adapter:
1. @Override
2. public final void bindToInsertValues(ContentValues values, DefaultModel model) {
3. if (model.count != null) {
4. values.put("`count`", model.count);
5. } else {
6. values.put("`count`", 55);
7. }
8. //...
9. }
我们在运行时插入它的值。这有一定的局限性:
- 常量, 纯字符串值
- No
Model,ModelContainer, or primitive can use this. - 必须是同一类型的
String类型需要通过进行转义:"\"something\""
