2017-05-23 4 views
6

を動作していない、何とかそれはローカライズUNICODEまたはとの結果を注文することはできませんローカライズ。私の場合は役に立たないのはNOCASEです。ルーム持続性ライブラリクエリCOLLATE私はこの年のGoogleのI/Oでリリースされた新しい<a href="https://developer.android.com/topic/libraries/architecture/room.html" rel="noreferrer">Room Persistance Library</a>を使用していますし、それは、これまで偉大な作業だ

まだこの機能を実現する方法はありますか?

@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'を使用するように、あなたがの一部としてそれを宣言する必要があります:インデックスでも、エンティティクラスの定義をコピーする必要がありますステートメントを作成 -

は(Kotlinで)私の実装があります'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

、私のために。 COLLATEQueryに指定する必要はありません。

も何LOCALIZED COLLATEは、ドキュメント(https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED)のときにローカライズされた照合が(部屋バージョン1.0.0で)実装されていない理由を私は知らないRoom

1

ではありません。この問題の報告書https://issuetracker.google.com/issues/68925249は修正済みとマークされていますが、おそらくリリースされていません。

したがって、CommonsWareが問題にコメントしたように醜い回避策があります - それをCREATE文で定義します。これはデータベースビルダーのコールバックで実装できます。しかし、問題があります - sqliteがalter collat​​eをサポートしていないため、create tableを使用する必要があります。また、コールバックにテーブルが存在するため、このテーブルを削除する必要があります。

@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 
     } 
    } 
} 
関連する問題

 関連する問題