触发器、引索和其他

本节包含一些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

  1. 指定一个@IndexGroup
  2. 对指定的属性添加@Index注解
  3. 编译工程,一个IndexPropertyget方法将会被生成

你可以非常简单的开启和关闭引索。

你可以添加任意多个@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.