2012-02-13 13 views
8

Bir değişkeni kullanarak (NSXMLParser öğesinin parçası olarak) bir yüklemeyi temel alarak bir nesne almayı deneyen bir yöntem yazmaya çalışıyorum. Kod şöyle görünür:Temel Verilerde Öğe adı için bir değişken kullanma

sınıfta tanımlanan bu değişkenleri vardır:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

@property (strong, nonatomic) NSString *model; 
@property (strong, nonatomic) NSString *element; 

Şimdi yöntemde, böyle isteğini kurmak: Artık

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

meydan - ne yapabilmek istiyorum geçerli:

// DOES NOT WORK 
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]]; 

B ut sonuç vermez. Bazı mucking sonra bu çalışır fark:

if ([self.element isEqualToString:@"name"]) { 
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]]; 
} 

Bu benim self.element (? Sanırım) doğru ayarlanmış söylüyor ama yüklem ifade sol tarafını sevmediğini değişken olmak.

Ben de denedim:

[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]]; 

... bir dize tercih belki sadece görmek için. Bu işi ben de yapamam.

Mümkün mü yapmaya çalıştığım şey bu mu? Çekirdek Veri dokümantasyonunu olabildiğince okudum ve bu şekilde yapan herhangi bir örnek kod bulamıyorum, ancak bunun mümkün olmadığını söylemek için hiçbir şey bulamadım.

DÜZENLEME: ve şimdi çalışma kodu: Daha önce yapmadıysanız

[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]]; 

cevap

14

, Predicate Programming Guide okuyun ve yüklemler hakkında her şeyi bulabilirsiniz.

Şimdi, eğer doğru bir şekilde anladım, iki dizge arasında bir yüklemeyi oluşturmak istiyorsunuz, ancak ilk tanımlı bir dizgi değil, ancak değişebilir.
Daha önce kullanmadım ama dinamik özellik adlarıyla bir yüklemeyi kullanarak sorununuzu çözebileceğinizi düşünüyorum. İşte belgelerinden

:

Dinamik Mülkiyet İsimler onlar %@ kullanarak bir biçim dizesi yerine konur zaman dize değişkenleri tırnak işaretleri Çünkü
, bir belirtmek için %@ kullanamazsınız dinamik özellik adı - aşağıdaki örnekte gösterildiği gibi .

NSString *attributeName = @"firstName"; 
NSString *attributeValue = @"Adam"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue]; 

Bu durumda biçimlendirilmiş biçim dizesi "Adem" gibi "ilk ad" olarak değerlendirilir.

Bir dinamik özellik adı belirtmek isterseniz, biçimindeki dizede aşağıdaki parçada gösterildiği gibi %K kullanın.

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; 

bu durumda yüklem biçim dizesi "Adam" (hayır tırnak işaretleri firstName etrafında olduğuna dikkat) gibi Firstname olarak değerlendirilir.

Daha fazla bilgi burada bulunabilir: Predicate Format String Summary.

+0

Bu mükemmel, teşekkürler. Kodumu işleyen özel bilgi parçası, argümanı bir değerden ziyade anahtar olarak ele alan% K değişkenidir. Şimdi çalışıyor =) – valdarin

+0

Bir şey değil :) Çekirdek Veriler ve Tahminler harika teknolojiler ve onlarla her şeyi yapabilirsiniz ... – matteodv

İlgili konular