2017-05-23 46 views
6

我使用的是在今年的谷歌I/O发布了新的Room Persistance Library和它的工作很大,到目前为止,但不知何故,它无法订购与UNICODE属地化结果。唯一的工作是NOCASE这是无用的在我的情况。间持久化图书馆查询COLLATE本地化工作不

有什么办法可以实现这个功能吗?

@Dao 
public interface ContactDao { 

    @Query("SELECT * FROM contact ORDER BY lastName COLLATE LOCALIZED") 
    Flowable<List<Contact>> getAll(); 
} 

如果我建立查询像上面我得到一个错误:在列定义如下方式的时间

Error:(21, 29) error: There is a problem with the query: [SQLITE_ERROR] 
SQL error or missing database (no such collation sequence: LOCALIZED) 
+0

如果我理解正确的话,使用'COLLATE LOCALIZED',你需要声明的一部分“CREATE TABLE”语句中的列约束。看起来你可以使用'Migration'来编写你自己的'CREATE TABLE'语句,尽管我不清楚如何为初始表创建(而不是升级)创建一个'Migration'。我不知道你是否是提交[这个问题]的人(https://issuetracker.google.com/issues/62007004),但我会密切关注它。 – CommonsWare

+0

嗨,你解决了吗? –

+0

不是......目前我只是在使用之前对列表进行排序。 'Collections.sort(nameOfYourList){o1,o2 - > Collat​​or.getInstance(Locale.GERMAN).compare(o1.lastName,o2.lastName)}' – denwehrle

回答

0

用户COLLATE

@ColumnInfo(collate = NOCASE) var name: String

它工作正常为了我。 不需要在Query中指定COLLATE

还没有LOCALIZED整理在Room

1

我不知道为什么(在房间1.0.0版本的)定位的排序规则不执行,当它在文档(https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED)。我发现这个问题报告https://issuetracker.google.com/issues/68925249被标记为固定 - 但它不可能被释放。

因此,CommonsWare提出的评论中存在丑陋的解决方法 - 在CREATE语句中对其进行了定义。这可以通过数据库构建器中的回调来实现。但有问题 - 我们必须使用create table,因为sqlite不支持alter collat​​e。由于表格在回调中存在,我们必须删除这个表格。

还有就是我实现(科特林) - 创建语句也必须复制的实体类的定义与指标:

@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 
     } 
    } 
}