2017-05-23 43 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 
     } 
    } 
}