触发器、引索和其他
本节包含一些SQLite的高级用法。这些功能是非常有用的,可用于提高数据库和应用的效能。
触发器
Trigger
是在数据库的某些操作之前或之后自动触发执行的一些动作。比如我们想要记录Friend
表中所有被更新的数据:
CompletedTrigger<Friend> trigger = Trigger.create("NameTrigger")
.after().update(Friend.class, Friend_Table.name)
.begin(
SQLite.insert(FriendLog.class)
.columnValues(FriendLog_Table.oldName.eq("old.Name"),
FriendLog_Table.newName.eq("new.Name"), FriendLog_Table.date.eq(System.currentTimeMillis()));
// starts a trigger
trigger.enable();
// stops a trigger
trigger.disable();
引索
Index
引索是表中特殊的列,可使检索变得非常快速。但建立引索的时间与数据库大小成正比,如果检索性能更重要,这种建立引索是值得的。
引索通过@Table
中的indexGroups()
参数声明。它们有点像UniqueGroup
:
- 指定一个
@IndexGroup
- 对指定的属性添加
@Index
注解 - 编译工程,一个
IndexProperty
get方法将会被生成
你可以非常简单的开启和关闭引索。
你可以添加任意多个@Table
中的属性作为@IndexGroup
:
@Table(database = TestDatabase.class,
indexGroups = {
@IndexGroup(number = 1, name = "firstIndex"),
@IndexGroup(number = 2, name = "secondIndex"),
@IndexGroup(number = 3, name = "thirdIndex")
})
public class IndexModel2 extends BaseModel {
@Index(indexGroups = {1, 2, 3})
@PrimaryKey
@Column
int id;
@Index(indexGroups = 1)
@Column
String first_name;
@Index(indexGroups = 2)
@Column
String last_name;
@Index(indexGroups = {1, 3})
@Column
Date created_date;
@Index(indexGroups = {2, 3})
@Column
boolean isPro;
}
现在我们可以利用生成的IndexProperty
加速我们的检索了:
SQLite.select()
.from(IndexModel2.class)
.indexedBy(IndexModel2_Table.firstIndex)
.where(...); // do a query here.