【问题标题】:Is it possible to create case insensitive Index via Room?是否可以通过 Room 创建不区分大小写的索引?
【发布时间】:2020-11-17 07:14:06
【问题描述】:

目前,我有一个 Room 实体,看起来像

@Entity(
        tableName = "holiday_country",
        indices = {
                @Index(value = "code", unique = true)
        }
)
public class HolidayCountry

相当于有索引

CREATE UNIQUE INDEX `index_holiday_country_code` ON `holiday_country` (`code`)

但是,我还需要有以下第二个索引,因为有时我会执行不区分大小写的查询。

CREATE UNIQUE INDEX `index_holiday_country_code_nocase` ON `holiday_country` (`code`  COLLATE NOCASE)

如果是这样,那么如何在 Room 实体中声明这样的索引?

【问题讨论】:

  • 如果您想要不区分大小写的查询,您可以使用LOWER(column) 并将其与myString.toLower() 进行比较。你试过了吗?
  • 我们更喜欢通过 DB 使用 COLLATE NOCASE 而不必在客户端代码中执行转换。

标签: android sqlite android-room


【解决方案1】:

很遗憾,在创建Index 时,没有选项可以在列上定义COLLATE。通过查看androidx.room.Index的源代码,我们可以看到唯一可能的选项是:

  1. 索引名称
  2. 定义唯一索引的选项

Index.java (为了简洁,省略了cmets)

package androidx.room;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({})
@Retention(RetentionPolicy.CLASS)
public @interface Index {
   
    String[] value();

    String name() default "";

    boolean unique() default false;
}

所以,Room 中唯一可能的方法是在表创建语句中定义COLLATE

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Index;

@Entity(
    tableName = "holiday_country",
    indices = {
        @Index(value = "code", unique = true)
    }
)
public class HolidayCountry {
        
    @ColumnInfo(name = "code", collate = ColumnInfo.NOCASE) 
    public String code;
        
    // Other fields ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2017-12-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多