如何在Android Room中创建部分索引

Sdg*_*emi 3 sqlite indexing android android-room

我想在名为MessagesonStateIdcolumns 的表上创建部分索引。WHERE通常,这可以通过添加一个子句来创建索引语句来完成,如官方文档中所述。正确的 SQLite 语句是:

CREATE INDEX `index_Messages_State_Id` ON `Messages` (`State`, `Id`) WHERE State = -2
Run Code Online (Sandbox Code Playgroud)

由于我目前使用 Room 作为 ORM,因此我不知道如何使用 Room 语法声明部分索引。

这是我的Messages表的简要说明:

@Entity(tableName = "Messages")
public class Message implements Parcelable {
    @PrimaryKey
    @SerializedName("i")
    @ColumnInfo(name = "Id")
    private long mId;

    @SerializedName("t")
    @ColumnInfo(name = "Type")
    private byte mType;

    @SerializedName("s")
    @ColumnInfo(name = "State")
    private byte mState;

    ....
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Est*_*mbi 5

我认为 Room 中没有明确的方法来执行此操作(截至 2019 年 7 月 22 日)。

在我的团队中,我们通过在迁移中定义部分索引来绕过这个障碍。

database.execSQL("CREATE INDEX `index_Messages_State_Id` ON `Messages` (`State`, `Id`) WHERE State = -2")
Run Code Online (Sandbox Code Playgroud)

注意:如果您的 Android 版本低于 21,这可能不起作用。部分索引仅适用于 SQLite 3.8.0及更高版本,API >= 21 支持部分索引

  • 好点子。解决这个问题的方法是使用旧的 Android SQLite 功能在应用程序启动时运行 SQL 语句。哈基,但还能做什么‍♂️ (2认同)