解除库与表的耦合度;表可以自己维护自己的升级;表自动升级;使用原有的数据库接口;协程接口
1、可以使用 jitpack 直接依赖 github 代码
2、在 root build.grable 加入
allprojects {
repositories {
google()
mavenCentral()
// 在依赖库列表的最后加入jit依赖库
maven { url 'https://jitpack.io' }
}
}
3、在 module build.grable 加入
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
// 加入kapt插件
id 'kotlin-kapt'
}
dependencies {
// 加入如下两行的依赖
implementation 'com.github.xpwu.kt-dbtable:ktdbtable:1.0.0'
kapt 'com.github.xpwu.kt-dbtable:ktdbtable-processor:1.0.0'
}
1、创建一个DB实例,首先使用底层的数据库实现DBer接口(同时实现DBInner与UnderlyingDBer接口),然后使用DB的构造
函数创建即可。在ktdbtable中已经实现了 SQLiteDatabase 与 SupportSQLiteDatabase 的 adapter (满足DBer接口),
如果使用的其他数据库接口,可参照写一个adapter即可;
2、用 @Table @Column @Index 注解对表做注解处理,只支持kotlin,不支持java,具体使用说明参见注释。
类中必须声明companion object,参见testcase 中的使用;
3、编译后,会生成新的方法,主要有 asTable()、各个列的名称;
4、在所有数据库的操作中,使用 asTable() 方法获取表名即可;
5、通过DB实例的UnderlyingDB属性获取到底层数据库对象,调用相关方法操作数据库即可。
6、也可在上层封装更方便的接口,例如sqliteadapter中的query方法
1、添加列:直接在代码中添加属性即可
2、删除列:表的代码里面删除属性即可
3、添加索引:直接用@Index指定新的索引即可
4、改列名:修改属性名而不修改真实字段名即可
5、创建新表:定义表的类,在使用此表的地方会自动创建,表名必须通过TableNameIn(db)获取
6、其他复杂升级:在表的类代码中实现 fun xxx.Companion.Migrators(): Map<Version, Migration>
同时在@Table中指定新的版本号
注意:ALTER xxx ADD COLUMN xxx 有如下要求 alter
- The column may not have a PRIMARY KEY or UNIQUE constraint.
- The column may not have a default value of CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP, or an expression in parentheses.
- If a NOT NULL constraint is specified, then the column must have a default value other than NULL.
- If foreign key constraints are enabled and a column with a REFERENCES clause is added, the column must have a default value of NULL.
- The column may not be GENERATED ALWAYS ... STORED, though VIRTUAL columns are allowed.
- 其中:UNIQUE 在本库中是通过CREATE UNIQUE INDEX 而添加,所有本库中支持UNIQUE列的添加
1、使用 xxx.TableNameIn(db) 方法时,会自动在db库中创建xxx表,并创建索引;
2、表与库是完全分离的,一个表的定义可以在多个不同的库中绑定,如果同一个
库中的表出现名字冲突,可以在创建DB的时候,直接绑定此表并指定此表在此库中的名字
1、库的所有操作都直接使用底层数据库的接口,所有必须要库升级时,按照原有升级策略实施就行,
ktdbtable不影响原有的升级
2、如果希望ktdbtable的升级也有进度提示,可以在创建DB时,最后一个参数传入false,然后手动
调用DB的Upgrade() 方法
在建表的时候,如果需要指定初始插入的数据,可以实现 fun Xxx.Companion.Initializer(): Collection 方法即可,类定义的初始化值并不会直接影响表的初始化,除非通过实现Xxx.Companion.Initializer()方法明确的指定用 类定义的初始化值初始化表
使用DBQueue 而不直接使用 DB 即可使用队列串行执行数据库操作,异步的返回使用协程方式。
在首次使用表时,自动创建/升级。如果需要在生成DB后就创建/升级,可以在DB构造时传入 tablesBinding 参数。
sqlite 不支持的类型会转化为 ByteArray 数据存储,需要编写该类型与ByteArray之间的转化函数,并用 @FromByteArray 与 @ToByteArray 注解。示例