2009-07-27 13 views
6

W moim podstawowym modelu danych mam podmiot z opcjonalnym atrybutem NSNumber.Przechowywanie opcjonalnego NSNumber w danych podstawowych

Jak sprawdzić, czy wartość w tym atrybucie jest ważna, czy nie?

Kiedy test na zero ... nie działa.

[self numberAttribute] == nil // always returns NO 

Kiedy testuję dla wartości int zera, to nie działa.

[[self numberAttribute] intValue] == 0 // always returns no 

W rzeczywistości [[self numberAttribute] intValue]] zwraca coś, co wygląda podejrzanie podobny wskaźnik do adresu pamięci.

Ktoś ma pojęcie, co robię źle?

EDYCJA: OK, błąd był w całkowicie niezwiązanej części kodu. NSNumber i Core Data działają dokładnie tak, jak można by oczekiwać. To powiedziawszy, zamierzam pójść z sugerowanym podejściem, czyniąc atrybut nieobowiązkowym i określając 0 jako wartość domyślną.

Po prostu umieszczenie tej notatki na chwilę dla każdego, kto oglądał to pytanie, a następnie usuwam ją.

+1

Nie mam wystarczającej liczby przedstawicieli do edycji, ale twój drugi przykładowy kod ma niezbalansowane nawiasy (2 nawiasy otwierające i 3 zamykające). – Mark

+0

Wielkie dzięki. Naprawiony. – mmc

+0

numberAttribute jest określana jako float w modelu danych? Jak zadeklarowana jest właściwość dla numberAttribute? Jak wyglądają te dodatki lub implementacje (jeśli nie korzystasz z @dynamicowych akcesorów). Bez tych informacji nie można odpowiedzieć dokładnie na twoje pytanie. –

Odpowiedz

0

Jeśli otrzymujesz dużą wartość z powrotem, która wygląda jak wskaźnik, być może jest to NaN (nie numer)?

Jeśli tak, można skontaktować się z:

isnan([[self numberAttribute] doubleValue]) 

Albo, być może jest jakaś inna stała wzdłuż linii NSNotFound (choć prawdopodobnie bardziej Rdzeń Dane specyficzne).

+0

Próbowałem kilku różnych smaków tej techniki, nie działało. Wartość, którą otrzymuję, nie jest stała i raportuje w debugerze (kolumna Podsumowanie) jako "Nieprawidłowy". To dość dziwne, założyłem, że jeśli w ogóle nie ustawiłem atrybutu i jeśli został on oznaczony jako "opcjonalny" z domyślną wartością "0" w pliku .xcdatamodel, nie byłoby to takie trudne. – mmc

+0

Jeśli jest to zaznaczone jako opcjonalne, wartość domyślna nie zostanie ustawiona ... Myślę, że zasadniczo otrzymujesz jakiś nieprawidłowy obiekt, który reprezentuje nieokreślony stan. Nie mogę znaleźć w Core Data tego, jak powinieneś rozpoznać nieprawidłowy obiekt ... –

+0

Sprawdziłem z kimś, kto ma działający projekt Core Data z opcjonalnymi atrybutami - myślał, że wartość nieustalona powinna być w rzeczywistości zerowa, tak jak sprawdzałeś. Więc pójdę z teorią, że wracasz do obiektu NSNumber tak, jak postulowałeś. –

5

Według documentation,

Można określić, że atrybut jest opcjonalny, to znaczy, że nie jest wymagane, aby mieć wartości. Zasadniczo jednak odradza się to - szczególnie w przypadku wartości numerycznych (zazwyczaj można uzyskać lepsze wyniki przy użyciu obowiązkowego atrybutu z wartością domyślną - w modelu 0). Powodem tego jest to, że SQL ma specjalne zachowanie porównawcze dla wartości NULL, które różni się od zera Objective-C. NULL w bazie danych to nie to samo, co 0, a wyszukiwanie 0 nie pasuje do kolumn z wartością NULL.

false == (NULL == 0) 
false == (NULL != 0) 

Ponadto NULL w bazie danych nie jest równoznaczne z pustym ciągiem lub pustym danych blob, albo:

false == (NULL == @"") 
false == (NULL != @"") 

Tak, spróbuj test z NULL, który jest nieważne. Co więcej, ustaw domyślne i zmień atrybut na nieobowiązkowy. Właśnie to robiłem w swoich modelach, a w praktyce działa całkiem nieźle.

Edytuj: Zobacz mój komentarz powyżej. Próbowałem utworzyć nowy zarządzany obiekt z opcjonalnym atrybutem, który nie został ustawiony i był zerowy.

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

Kolejny edit: Wróciłem do tego później i wyrejestrowany obiekt załadowany z pamięci podręcznej w debugger (gdb jest twoim przyjacielem!). Próbował uzyskać dostęp do lokalizacji pamięci 0x0, która ma wartość NULL.

+0

Tak, ale prawdziwe pytanie brzmi, czy masz atrybut zadeklarowany jako opcjonalny - jak sprawdzić, czy jest ustawiony, czy nie? –

+0

Prawda. Zrobiłem jeszcze kilka sprawdzeń i dodałem szczegóły do ​​mojej odpowiedzi. – Don

+0

Zgadzam się, teraz to jest właściwy czek, tajemnicą jest to, że nie jest on zerowy, ale ma jakąś dziwną wartość ... –

0

Jeśli wygląda jak wskaźnik, może to być wskaźnik do instancji NSNumber. Upewnij się, że nie występuje niezgodność między podstawowym modelem danych a klasą (np. NSInteger, gdzie spodziewany jest NSNumber*).

Jeśli masz skalar w swojej klasie, musisz to odnotować w setNilValueForKey:.

+1

Wydaje mi się, że to chyba dobrze (nie, że ktoś z tym niesamowitym kapeluszem potrzebuje kopii zapasowej w jakikolwiek sposób). –

Powiązane problemy