2012-08-05 9 views
5

मैं एक प्रकार के वर्णनकर्ता के साथ एक fetch अनुरोध के परिणाम क्रमबद्ध कर रहा हूँ।nspredicate का उपयोग कर गैर-अंग्रेजी तारों को कैसे क्रमबद्ध करें?

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:[MyEntity entityName]]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"property" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
return [self.managedObjectContext executeFetchRequest:req error:nil]; 

समस्या शब्द है, जो की तरह 'मैं' सूची के अंत में सूचीबद्ध हैं गैर अंग्रेजी वर्ण के साथ शुरू होता है। यह एक तुर्की पत्र है और वर्णमाला इस तरह दिखता है:

ए, बी, सी, Ç, डी, ई, एफ, जी, Ğ, एच, आई, आई, जे, के, एल, एम, एन, ओ, ओ, पी, आर, एस, एस, टी, यू, Ü, वी, वाई, जेड

तो पत्र 12 वें स्थान पर है।

मुझे नहीं पता कि वस्तुओं का काम करने के बाद तुलनित्र का उपयोग क्यों किया जाता है। तो यह किसी भी सरणी पर काम करता है लेकिन अनुरोध अनुरोध के लिए क्रमबद्ध वर्णनकर्ता के साथ नहीं।

उत्तर

3

NSFetchedResultsController v.s. UILocalizedIndexedCollation पर मेरे प्रश्न के विवरण पर एक नज़र डालें, मैं दिखाता हूं कि UILocalizedIndexedCollation का उपयोग कैसे करें वर्णमाला को सही ढंग से उत्पन्न करने के लिए और UILocalizedIndexCollation के आधार पर सही सॉर्ट विधि का उपयोग करके सॉर्ट करें। मेरा सवाल बस ऐसा करने के लिए एक बेहतर तरीका मांगने के आसपास घूमता है।

यदि आप UILocalizedIndexCollation का उपयोग नहीं करते हैं तो आपको केवल स्थानीयकृत मानक कॉम्पैयर का उपयोग करना चाहिए: स्थानीयकरण नहीं, स्थानीयकरण के लिए डब्ल्यूडब्ल्यूडीसी वीडियो में उल्लिखित कॉम्पैयर।

1

[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES selector:@selector(localizedCompare:)] 

संपादित

@Mert अपने प्रश्न को अपडेट किया गया प्रयास करें। ऐसा लगता है कि localizedCompare: तुर्की अक्षरों को सही तरीके से टाइप करता है, लेकिन fetch अनुरोध के साथ काम नहीं करता है।

यह समस्या मैंने इस समस्या का परीक्षण करने के लिए किया है। शायद आप जाँच कर सकते हैं कि यदि आपके वातावरण में काम करता है और फिर वहाँ से काम करते हैं:

// Create some entities: 
NSArray *a = @[@"İ", @"J", @"Ğ", @"G", @"H", @"I", @"Ç", @"C"]; 
for (NSString *s in a) { 
    MyEntity *e = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" 
               inManagedObjectContext:self.managedObjectContext]; 
    e.name = s; 
} 

// Fetch all entities in sorted order: 
NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
NSArray *result = [self.managedObjectContext executeFetchRequest:req error:nil]; 

"MyEntity" एक विशेषता "नाम" प्रकार स्ट्रिंग की के साथ एक कोर डाटा इकाई है।

+0

यह यह की वजह उपयोगकर्ताओं भाषा

निम्नलिखित सामग्री के साथ NSString पर एक वर्ग बनाने का प्रयास करें के आधार पर एक साफ NSLocale बनाने के लिए आवश्यक है काम नहीं किया मैंने सिम्युलेटर की भाषा बदलने की भी कोशिश की। – Mert

+0

यह अजीब बात है। अगर मैं '[myArray sortedArrayUsingSelector: @selector (localizedcompare :)]' के साथ एक सरणी सॉर्ट करता हूं तो मुझे सही परिणाम मिलते हैं। क्या आप कोड दिखा सकते हैं कि आप fetch अनुरोध कैसे सेट करते हैं? –

+0

मैंने अपना प्रश्न संपादित किया और कोड – Mert

0

मैं के साथ एक समान समस्या नहीं थी:

[strArr sortedArrayUsingSelector:@selector(localizedCompare:)]

ऐसा लगता है कि

localizedCompare

कॉल

compare:other options:nil range:NSMakeRange(0, self.length) locale: [NSLocale currentLocale]];

[NSLocale currentLocale] उपयोगकर्ता वरीयताओं के आधार पर मिश्रित स्थिति में हो सकता है।

-(NSComparisonResult)currentLocalCompare:(id)other 
{ 
    NSLocale * currLoc = [NSLocale currentLocale]; //get current locale 
    NSLocale * loc = [[NSLocale alloc] initWithLocaleIdentifier:currLoc.localeIdentifier];//lets create a new clean NSLocale based on users prefared langauge 
    return [self compare:other options:nil range:NSMakeRange(0, self.length) locale:loc];//compare using clean NSLocale 
} 

और इसे कहते चाहते:

[strArr sortedArrayUsingSelector:@selector(currentLocalCompare:)]

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