2010-05-30 9 views
52

Ich habe eines meiner Kerndatenattribute als Boolean eingerichtet. Jetzt muss ich es einstellen, aber XCode sagt mir immer wieder, dass es nicht auf setUseGPS reagiert.iPhone: Speichere Boolean in Core Data

[ride setUseGPS: useGPS.on]; 

Was ist die Methode zum Setzen eines Boolean in Kerndaten? Alle meine anderen Attribute sind so eingestellt, und sie funktionieren großartig. Also, nicht sicher, warum ein Boolean nicht funktioniert, um so eingestellt zu werden?

+0

Check out NSNumber –

Antwort

131

Core Data "hat keinen" booleschen Typ (tut es, aber es ist eine NSNumber).

Um das Äquivalent von useGPS = YES zu setzen.

[entity setUseGPS:[NSNumber numberWithBool:YES]]; 

Und umgekehrt:

BOOL isGPSOn = [[entity useGPS] boolValue]; 

Update: Wie bereits von SKG heraus, mit Literalen in Objetive-C Sie jetzt es auf einfachere Art und Weise zu tun:

[entity setUseGPS:@YES]; 

BOOL isGPSOn = entity.useGPS.boolValue; 
+9

Sie die Werte einstellen... wie das auch: 'object.isGPSOn = @YES;' – guptron

+0

Offensichtlich kann ich den Booleschen Typ im Dropdown wirklich sehen, wenn ich ein neues Attribut im Kerndateneditor erstelle.Was ist das? –

0

Die "Lösung" dafür (IMHO, es ist ein Fehler in Apples SDK) ist, den folgenden Code zu Ihrer CoreData-generierten Klasse hinzuzufügen. NB: Wenn Sie dies in einer Kategorie zu tun, in einer separaten Datei, dann müssen Sie nicht erneut copy/paste es jedes Mal, wenn Sie die Coredata-Klassen innerhalb Xcode regenerieren

- (BOOL)useGPS 
{ 
    [self willAccessValueForKey:@"useGPS"]; 
    BOOL myuseGPS = [[self primitiveUseGPS] boolValue]; 
    [self didAccessValueForKey:@"useGPS"]; 
    return myuseGPS; 
} 

- (void)setUseGPS:(BOOL)newValue 
{ 
    [self willChangeValueForKey:@"useGPS"]; 
    [self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]]; 
    [self didChangeValueForKey:@"useGPS"]; 
} 
+0

Dies führt zu in Konflikt stehenden Typen, wenn ich kompiliere. Sollte ich die Typen der vorhandenen NSNumber-Eigenschaften ändern? –

+0

@Daniel Wood - die vorhandenen Typen nicht ändern: CoreData erfordert, dass sie NSNumber sind Kompilieren von Warnungen ist ärgerlich - die einfache Umgehung besteht darin, die beiden obigen Methoden in "useGPSAsBool" und "setUseGPSAsBool" umzubenennen. NB: Sie können immer noch auf die Eigenschaft zugreifen, nur es heißt jetzt "GPSAsBool", z. "if (myCoreDataObject.GPSAsBool)" – Adam

+0

Nachdem ich Folgendes in den Dokumenten gelesen habe, habe ich beschlossen, mich nicht mehr damit zu beschäftigen und einfach von NSNumber in meinen Code zu konvertieren: "Die Vorteile, Core Data zu verwalten, überwiegen in der Regel alle Vorteile direkte Interaktion mit skalaren Werten "http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html –

18

Als alternativen Ansatz zu dem akzeptierte Antwort, können Sie einfach die Eingabe von einem auf ein BOOL in der Objektschnittstellendefinition verwaltet, NSNumber * ändern wie:

@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject 

Verschiedene alternative Ansätze here diskutiert werden, aber Chris Hanson ‚s Antwort war für mich am meisten Beleuchtungs insbesondere:

Wenn Sie ein numerisches Attribut (einschließlich einer boolean-Attribut), die ist erforderlich, können Sie es einfach als Skalartyp statt und Core Data das Richtige tun wird:

@property (nonatomic) BOOL isDone;

Auch wenn das Attribut optional ist, das wird immer noch funktionieren - es wird nur conflate "nicht vorhanden" mit "false".

und für eine Cocoa Umsetzung ausgerichtet:

Eine andere Sache, die Sie tun wollen könnte, ist der Name der Eigenschaft „done“ und nur den Getter als angeben „IstFertig.“ Das ist die übliche Kakao Namenskonvention:

@property (nonatomic, getter = isDone) BOOL getan;

Dann können Sie schreiben "if (item.done) { ...}" oder "Artikel.done = NO“, und der Compiler noch -isDone für Zugriffe des Objektes erzeugen

Dank Chris, und hoffen, dass dies jemand hilft

+1

Ich sehe einen Absturz auf iOS 4.x, wenn ich diese Methode ausprobiere. Hier ist die Nachricht: "Property 'bar' ist ein Skalartyp für die Klasse 'Foo'. Es kann keine Getter-Methode dafür generiert werden." Ich habe versucht, den Attributtyp im Kerndatenmodell auf Boolean zu setzen, und ich habe auch Integer 16 ausprobiert. Ich bekomme den gleichen Absturz in beide Richtungen. Fehle ich etwas? Vielleicht werde ich einfach zu NSNumber zurückkehren. –

+2

Soweit ich weiß, funktioniert dies nicht für NSManagedObject-Unterklassen. – teh1