2010-05-17 27 views
9

SQLite kayıtlarını yönetmek için Core Data'yı arka uç olarak kullanan bir uygulama üzerinde çalışıyorum. Dizeler ve sayılar ile çalışan her şeye sahibim, ancak BOOL alanlarını eklemeyi denedim ve işleri işe yaramayacak gibi görünmüyor.Temel Veriler ve BOOL ayarları

.xcdatamodel'de, isCurrentlyForSale adlı Aracım için Geçici olmayan ve Dizine Eklenmeyen isteğe bağlı olmayan bir alan ekledim. Özniteliğin türü, varsayılan değer NO ile Boole'ye ayarlanır. Veri modelinden sınıf dosyaları yarattığında

, Demirbaş kodu .h başlığında bu özellik için ilave oldu:

@dynamic isCurrentlyForSale; 

birlikte

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

.m içinde uygulama dosyası.

Boole'larla her zaman basit BOOL'lar olarak çalıştım. NSNumber'in numberWithBool ve boolValue yöntemlerini kullanabileceğimi okudum, ancak bu çok basit bir şey için çok fazla kod gerektiriyor.

Üstbilgideki @property basit bir BOOL olarak değiştirilebilir mi? Eğer öyleyse dikkat edilecek bir şey var mı?

Teşekkür John

cevap

2

Basit yanıtı : Hayır, bir BOOL dönmek için @property beyanı değiştiremezsiniz.

Bazı basit paketleyicileri yazabilirsiniz. Ben (o currentlyForSale ve setCurrentlyForSale: üretir anlamına gelir) currentlyForSale için niteliğini yeniden adlandırın ve sonra da iki sarmalayıcıları yazmak istiyorum:

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

Bir düzenleyici veya özellik "içinde" olmalıdır. Bu yüzden '@ özelliği' getter = 'ayarına sahiptir. Ve evet, "@ özelliği", Çekirdek Verilerin bir parçası olan ilkel erişimleri kullanarak BOOL olarak değiştirilebiliyor. –

+0

@Marcus Evet, ayarlayıcıların içinde "Ol" bulunmaması gerektiğini biliyorum, ama onu koydum çünkü 'setCurrentlyForSale:' zaten CD tarafından alındı ​​(ve getter = 've' setter = 'un farkındayım. Ve sadece "NSNumber *" 'ı üstbilgideki' BOOL 'olarak değiştirebileceğinizi mi söylüyorsunuz?Bu kesinlikle * beni şaşırtır. –

30

Dave DeLong cevabı yakın olsa da, aslında adını değiştirmek zorunda kalmadan bunu yapabilirsiniz özellikler.

Sen bir BOOL dönmek özelliğini değiştirebilir ancak o zaman elle erişim yöntemine yazmaya gerek ve onlar Dave'in yanıt olarak sahip olandan biraz farklı.

İlk senin @property olarak tanımlanmalıdır: yerine @dynamic özelliğini bildirmek, sizin uygulama dosyasında Sonra

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale; 

doğrudan erişimcileri oluşturmak.

- (BOOL)isCurrentlyForSale 
{ 
    [self willAccessValueForKey:@"currentlyForSale"]; 
    BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue]; 
    [self didAccessValueForKey:@"currentlyForSale"]; 
    return b; 
} 

- (void)setCurrentlyForSale:(BOOL)b 
{ 
    [self willChangeValueForKey:@"currentlyForSale"]; 
    [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"]; 
    [self didChangeValueForKey:@"currentlyForSale"]; 
} 

bu set ile kendi nesne sizin için boks idare edecek ve ilkel bir değer olarak erişebilir. Ayrıca, setIs ile başlayan bir setter harika bir fikir değildir, bu nedenle örnek kodda kaldırılması.

+0

+1 ah, şimdi söylediklerinizi alıyorum. Özelliğin "özelliğinizi" "BOOL" olarak değiştirebileceğinizi ve özel yöntemler uygulayamayacağınızı ima ettiniz. Kenara göre, setter biraz yanlış. ChangeValueForKey: '(will | did), yalnızca yeni değer gerçekten farklıysa çağrılmalıdır (yani, bir if deyimine ihtiyacınız vardır). –

+0

Mükemmel örnek ve açıklama - teşekkürler Marcus! –

+0

Ekleyebildiğim tek şey, anahtar isimler için NSString sabitlerini kullanmaktan hoşlandığım, daha sonra yazım hatası yapmaktan sıkıntı çekmekten kurtardı. 'NSString * const CurrentlyForSale = @" currentlyForSale ";' – Eric

İlgili konular