我正在使用今年Google I / O发布的新版Room Persistance Library,目前它的工作效果很好,但不知道怎样才能用 UNICODE 或局部化即可。唯一有效的是 NOCASE ,这在我的情况下是没用的。
有没有办法实现这个功能呢?
this.props.location.state
如果我像上面那样构建查询,我会收到错误:
@Dao
public interface ContactDao {
@Query("SELECT * FROM contact ORDER BY lastName COLLATE LOCALIZED")
Flowable<List<Contact>> getAll();
}
答案 0 :(得分:3)
您必须使用这些版本的房间
compile "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
更新房间标线之后
您可以使用此功能
@ColumnInfo(collate = NOCASE)
答案 1 :(得分:1)
我不知道为什么在文档(https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED)中没有实现LOCALIZED排序规则(在房间版本1.0.0中)。我发现此问题报告https://issuetracker.google.com/issues/68925249被标记为已修复 - 但可能不会发布。
因此,当CommonsWare评论时,有一个丑陋的解决方法 - 在CREATE语句中定义它。这可以通过数据库构建器中的回调来实现。但是有问题 - 我们必须使用create table,因为sqlite不支持alter collate。并且因为表存在于回调中,我们必须删除该表。
我的实现(在Kotlin中) - create语句必须使用索引复制实体类定义:
@Database(entities = [(LocalityItem::class)], version = AppDatabase.DB_VERSION, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun localityDao(): LocalityDao
companion object {
const val DB_NAME : String = "app_db"
const val DB_VERSION : Int = 1
private var INSTANCE: AppDatabase? = null
private val CALLBACK: Callback = object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
db.execSQL("DROP TABLE `locality` ")
db.execSQL("CREATE TABLE `locality` ("
+ " `id` INTEGER,"
+ " `type` INTEGER,"
+ " `name` TEXT COLLATE LOCALIZED, "
+ " `row_index` INTEGER,"
+ " `col_index` INTEGER,"
+ " PRIMARY KEY(`id`)"
+ ")")
db.execSQL("CREATE INDEX `index_locality_type` ON `locality` (`type`)")
db.execSQL("CREATE INDEX `index_locality_name` ON `locality` (`name`)")
}
}
fun getInstance(context : Context) : AppDatabase? {
if (INSTANCE == null) {
synchronized(AppDatabase::class) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java, DB_NAME)
.addCallback(CALLBACK)
.build()
}
}
return INSTANCE
}
}
}
答案 2 :(得分:-1)
按照以下方式在列定义时使用COLLATE
,
@ColumnInfo(collate = NOCASE) var name: String
这对我来说很好。
无需在COLLATE
中指定Query
。
LOCALIZED
Room
整理