2017-05-23 20 views
6

काम नहीं कर स्थानीय है, लेकिन किसी भी तरह यह यूनिकोड या स्थानीयकृत के साथ परिणाम ऑर्डर करने के लिए संभव नहीं है । काम करने वाली एकमात्र चीज NOCASE है जो मेरे मामले में बेकार है।कक्ष हठ लाइब्रेरी क्वेरी मुक़ाबला मैं नए <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

अगर मैं सही ढंग से समझ, 'उपयोग करने के लिए मुक़ाबला LOCALIZED', आप घोषित करने के लिए है कि के हिस्से के रूप की जरूरत है: बयान बनाने के सूचकांक भी इकाई वर्ग परिभाषा कॉपी चाहिए -

मेरी कार्यान्वयन (Kotlin में) नहीं है 'तालिका बनाएं' कथन में एक कॉलम बाधा। ऐसा प्रतीत होता है कि आप अपने 'CREATE तालिका' कथन को कोड करने के लिए 'माइग्रेशन' का उपयोग कर सकते हैं, हालांकि यह प्रारंभिक तालिका निर्माण (बनाम अपग्रेड) के लिए' माइग्रेशन 'बनाने का तरीका नहीं है। मुझे नहीं पता कि क्या आप [इस मुद्दे] दायर किए गए थे (https://issuetracker.google.com/issues/62007004), लेकिन मैं इस पर नजर रखूंगा। – CommonsWare

+0

हाय, क्या आपने इसे ठीक किया? –

+0

वास्तव में नहीं ... इस समय मैं उपयोग करने से पहले सूची को सॉर्ट करता हूं। 'संग्रह .sort (nameOfYourList) {o1, o2 -> Collator.getInstance (Locale.GERMAN) .compare (o1.lastName, o2.lastName)}' – denwehrle

उत्तर

0

उपयोगकर्ता COLLATE

@ColumnInfo(collate = NOCASE) var name: String

यह ठीक काम कर रहा है मेरे लिए। Query में COLLATE निर्दिष्ट करने की आवश्यकता नहीं है।

इसके अलावा वहाँ कोई LOCALIZEDRoom

1

में मुक़ाबला क्यों स्थानीय मिलान (कमरा संस्करण 1.0.0 में) लागू नहीं है जब यह प्रलेखन (https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.html#LOCALIZED) में है मैं नहीं जानता है। मुझे यह समस्या रिपोर्ट https://issuetracker.google.com/issues/68925249 मिली है जिसे निश्चित के रूप में चिह्नित किया गया है - लेकिन शायद इसे जारी नहीं किया गया है।

तो कॉमन्सवेयर ने प्रश्न में टिप्पणी के रूप में बदसूरत कामकाज किया है - इसे CREATE स्टेटमेंट में परिभाषित करें। इसे डेटाबेस निर्माता में कॉलबैक द्वारा कार्यान्वित किया जा सकता है। लेकिन समस्या है - हमें बिल्ड टेबल का उपयोग करना होगा क्योंकि स्क्लाइट कोलेट को बदलने में सहायता नहीं करता है। और क्योंकि कॉलबैक अभी तक कॉलबैक में मौजूद है, इसलिए हमें इस तालिका को हटाना होगा।

@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 
     } 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे