2017-05-23 21 views
6

Tôi đang sử dụng mới Room Persistance Library phát hành tại năm này Google I/O và nó làm việc tuyệt vời cho đến nay, nhưng bằng cách nào đó nó không thể ra lệnh cho các kết quả với UNICODE hoặc cục . Điều duy nhất làm việc là NOCASE đó là vô ích trong trường hợp của tôi.Phòng kiên trì Thư viện Query đối chiếu cục bộ không làm việc

Có cách nào để đạt được chức năng này chưa?

@Dao 
public interface ContactDao { 

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

Nếu tôi xây dựng các truy vấn như trên tôi nhận được một lỗi:

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

Nếu tôi hiểu đúng, sử dụng 'đối chiếu LOCALIZED', bạn cần phải tuyên bố rằng như là một phần của một ràng buộc cột trong câu lệnh 'CREATE TABLE'. Có vẻ như bạn có thể sử dụng 'Migration' để viết câu lệnh' CREATE TABLE' của riêng bạn, mặc dù nó không rõ ràng với tôi cách tạo một 'Migration' cho việc tạo bảng ban đầu (so với nâng cấp). Tôi không biết nếu bạn là người nộp [vấn đề này] (https://issuetracker.google.com/issues/62007004), nhưng tôi sẽ theo dõi nó. – CommonsWare

+0

Xin chào, bạn đã sửa nó chưa? –

+0

Không thực sự ... tại thời điểm này tôi chỉ cần sắp xếp danh sách trước khi tôi sử dụng. 'Collections.sort (nameOfYourList) {o1, o2 -> Collator.getInstance (Locale.GERMAN) .compare (o1.lastName, o2.lastName)}' – denwehrle

Trả lời

0

tài COLLATE tại thời điểm cột xác định trong sau bằng cách nào,

@ColumnInfo(collate = NOCASE) var name: String

Nó đang làm việc tốt cho tôi. Không cần chỉ định COLLATE trong Query.

Cũng không có LOCALIZED chiếu trong Room

1

Tôi không biết tại sao đối chiếu cục bộ không được thực hiện (trong phiên bản 1.0.0 Phòng) khi nó là trong tài liệu (https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED). Tôi đã tìm thấy báo cáo vấn đề này https://issuetracker.google.com/issues/68925249 được đánh dấu là cố định - nhưng nó không được phát hành.

Vì vậy, có giải pháp thay thế xấu như CommonsWare đã nhận xét được đề cập - xác định nó trong câu lệnh CREATE. Điều này có thể được thực hiện bằng cách gọi lại trong trình tạo cơ sở dữ liệu. Nhưng có vấn đề - chúng ta phải sử dụng tạo bảng vì sqlite không hỗ trợ thay đổi collate. Và vì bảng tồn tại trong khi gọi lại, chúng ta phải xóa bảng này.

Có thực hiện của tôi (trong Kotlin) - tạo ra tuyên bố phải sao chép định nghĩa lớp thực thể cũng với các chỉ số:

@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 
     } 
    } 
} 
Các vấn đề liên quan