2017-05-23 2 views
6

J'utilise la nouvelle Room Persistance Library publié cette année au Google I/O et cela fonctionne grand jusqu'à présent, mais de toute façon il est impossible de commander les résultats avec UNICODE ou ENDROITS . La seule chose qui fonctionne est NOCASE qui est inutile dans mon cas.Chambre Persistance Bibliothèque de requête COLLATE LOCALISEES ne fonctionne pas

Existe-t-il un moyen d'atteindre cette fonctionnalité?

@Dao 
public interface ContactDao { 

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

Si je construis la requête comme ci-dessus je reçois une erreur:

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

Si je comprends bien, d'utiliser 'COLLATE LOCALIZED', vous devez déclarer que dans le cadre de une contrainte de colonne dans l'instruction 'CREATE TABLE'. Il semblerait que vous pouvez utiliser un 'Migration' pour coder votre propre instruction' CREATE TABLE', bien qu'il ne soit pas clair comment créer une 'Migration' pour la création de la table initiale (vs une mise à jour). Je ne sais pas si vous étiez celui qui a déposé [ce numéro] (https://issuetracker.google.com/issues/62007004), mais je garderais un œil dessus. – CommonsWare

+0

Salut, l'avez-vous réparé? –

+0

Pas vraiment ... pour l'instant, je trier juste la liste avant de l'utiliser. 'Collections.sort (nameOfYourList) {o1, o2 -> Collator.getInstance (Locale.GERMAN) .compare (o1.lastName, o2.lastName)}' – denwehrle

Répondre

0

utilisateur COLLATE au moment de la colonne définir de la manière suivante,

@ColumnInfo(collate = NOCASE) var name: String

Il fonctionne bien pour moi. Pas besoin de spécifier COLLATE dans Query.

il n'y a pas LOCALIZED également à collationner Room

1

Je ne sais pas pourquoi la collation est LOCALISEES pas mis en œuvre (dans la version chambre 1.0.0) lorsqu'il est dans la documentation (https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED). J'ai trouvé ce problème rapport https://issuetracker.google.com/issues/68925249 qui est marqué comme fixe - mais il n'est pas libéré probablement. Donc, il existe une solution de contournement moche comme CommonsWare a commenté en question - définissez-le dans l'instruction CREATE. Cela peut être implémenté par rappel dans le générateur de base de données. Mais il y a un problème - nous devons utiliser create table car sqlite ne supporte pas alter collate. Et parce que la table existe encore dans le rappel, nous devons supprimer cette table.

Il est ma mise en œuvre (en Kotlin) - create doit copier la définition de classe d'entité également avec des index:

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