2017-01-13 2 views
1

Vielen Dank im Voraus für Ihre Zeit zum Lesen und hoffen, mir zu helfen. Ich bin relativ neu in der Codierung und das aktuelle Problem, mit dem ich konfrontiert bin, ist;Wie ruft man eine int/NSNumber auf und ruft sie beim Aufruf einer sqlite3-Datenbank in Objective-C auf?

Ich habe eine SQLite3-Datenbank mit drei Spalten erstellt, die jeweils als gespeichert werden; string, float und ein int. Beim Versuch, die Spalten zu lesen und darzustellen, habe ich Probleme, eine Methode zu finden, um die Werte float und int darzustellen.

Die drei Eigenschaften, die in der Datenbank gespeichert sind, werden wie folgt festgelegt:

@property (nonatomic, strong) NSString *name; 
@property (nonaomtic, strong) NSNumber *price; 
@property (nonaomtic, strong) NSNumber *quantity; 

Ich bin mir nicht sicher, ob vielleicht die letzten beiden Eigenschaften in Float und Int ändern würde einen Unterschied machen?

Allerdings liegt die Hauptverwirrung für mich in dem folgenden Code, den ich gemacht habe, um die Datenbank aufzurufen;

-(void)readDataFromDatabase{ 
[self.stock removeAllObjects]; 

sqlite3 *database; 

if (sqlite_open([self.databasePath UTF8String], &database) == SQLITE_OK) { 
    char *sqlStatement = "select * from entries"; 
    sqlite3_stmt *compiledStatement; 

if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK){ 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW{ 
     char *n = sqlite3_column_text(compiledStatement, 1); 
     char *p = sqlite3_column_int(compiledStatement, 2); 
     chat *q = sqlite3_column_int(compiledStatement, 3); 

     NSString *name = [NSString stringWithUTF8String:n]; 
     NSNumber *price = [NSString stringWithUTF8String:p]; 
     NSNumber *quantity = [NSString stringWithUTF8String:q]; 

     Data *data = [[Data alloc] initWithData:name thePrice: price theQuantity:quantity]; 
     [self.stock addObject:data]; 
    } 
    } 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 
} 

Mein gesunder Menschenverstand sagt mir, das Problem in diesem Abschnitt liegt;

NSString *name = [NSString stringWithUTF8String:n]; 
NSNumber *price = [NSString stringWithUTF8String:p]; 
NSNumber *quantity = [NSString stringWithUTF8String:q]; 

Ich bin mir nicht sicher, wie ich die NSNumber nähern sollte? Ich bin mir bewusst, dass der NSString stringWithUTF8String nicht korrekt ist, aber ich kenne nicht die Entsprechung für NSNumber.

Ich würde wirklich jede Einsicht und Hilfe in dieser Angelegenheit schätzen.

Vielen Dank!

+0

Warum denken Sie nicht, dass "NSString stringWithUTF8String" korrekt ist? Außerdem sind Sie auf dem richtigen Weg, wenn Sie "NSNumber" durch "float" und "int" ersetzen, wenn sie das benötigen (zB '@property (nonaomtic, strong) float price;' usw.)Da du sie in deiner Kopfzeile deklarierst, müßtest du nur folgendes tun: 'price = (dein Gleitkommawert);' ... –

+0

Vielen Dank für deine Antwort! Mein bisheriges Verständnis scheint mich zu alarmieren, dass der Versuch, eine NSNumber zu setzen, eine Methode ist, die auf die Klasse von NSString anwendbar ist, um einfach nicht korrekt zu sein? Wie ich glaube (bitte korrigieren Sie mich, wenn ich falsch liege), dass der Zweck von stringWithUTF8String aufgerufen wird, damit das Zeichen (ein c "Objekt") in einer Weise gelesen werden kann, die mit NSString (einem Ziel-c Objekt) übereinstimmt. Und ich glaube, dass Ints und Floats ein gemeinsames "Objekt" zwischen den beiden Sprachen sind, also muss keine Konvertierung auf diese Weise gemacht werden? Ich freue mich auf Ihre Antwort, danke :) – FarisZ

+0

Oh! das ist was du meinst ... ich habe nicht aufgepasst und nur den gesehen, den du für 'name' eingestellt hast, was richtig aussieht. Die anderen, nein, du würdest nicht so untergehen. Alles, was sie wirklich brauchen, sind die grundlegenden C-Stil Deklarationen. (zB 'float price = 10.2;', oder 'int quantity = 5;'), aber da du sie in einer Kopfzeile deklarierst, nehme ich an, dass du nur 'price = 10.2; ',' quantity = 5; ', usw. –

Antwort

0

Sie sind auf dem richtigen Weg mit dem, was Sie für float und int erwähnt haben. Float muss nicht wie NSString referenziert werden, da die Größe zwischen 32-Bit- und 64-Bit-Systemen nicht variiert. Wenn Sie Ihre ganze Zahl größer ist, dann würde ich mit NSInteger für diesen Wert recommened:

char *n = sqlite3_column_text(compiledStatement, 1); 
float p = sqlite3_column_text(compiledStatement, 2); 
int q = sqlite3_column_text(compiledStatement, 3); 

NSString *name = [NSString stringWithUTF8String:n]; 
float price = p; 
NSInteger quantity = q; 

Hinweis: Sie haben nicht die * für den Schwimmer oder Werte int, da sie keine Zeiger sind.

Sie könnten sogar in der Lage sein, genau das zu tun (Wenn Sie bereits die Eigenschaften in der Kopfzeile erklärt):

name = [NSString stringWithUTF8String:sqlite3_column_text(compiledStatement, 1)]; 
price = sqlite3_column_text(compiledStatement, 2); 
quantity = sqlite3_column_text(compiledStatement, 3); 

Um die Werte zu überprüfen, können Sie verwenden NSLog:

NSLog(@"%@ %.02f %li", name, price, quantity); 

Der Vollständigkeit willen, wenn Sie die float und int zu NSNumber machen wollten:

NSString *name = [NSString stringWithUTF8String:n]; 
NSNumber *price = [NSNumber numberWithFloat:p]; 
NSNumber *quantity = [NSNumber numberWithInt:q]; 

Mit den Eigenschaften in der Kopfzeile erklärt:

name = [NSString stringWithUTF8String:n]; 
value = [NSNumber numberWithFloat:p]; 
quantity = [NSNumber numberWithInt:q]; 

NSLog(@"%@ %@.02f %@", name, price, quantity); 

mehr Möglichkeiten Es gibt Ihr Ergebnis zu bekommen, und das ist, was Objective-C sehr flexibel macht.

+0

Vielen Dank! Die Fehlermeldungen wurden durch Entfernen des * entfernt. Sie waren sehr hilfreich, ich schätze es sehr. Ich habe jetzt ein anderes Problem! Das liegt an der benutzerdefinierten Klasse von UITableViewCell, da ich ein primäres und sekundäres Label-Objekt erstellt habe, aber das sekundäre Label ist so eingestellt, dass es den Preis anzeigt, aber kein float. Der Code ist ruhig lange und meine Aufschlüsselung meines Problems wird nicht in diese Kommentare passen! Also muss ich warten bis die "nur alle 90 Minuten eine Frage posten" vorbei ist. Ich würde wirklich Ihre Hilfe in diesem Fall schätzen, wenn es gepostet wird :) – FarisZ

+0

Gern geschehen! Da dies ein anderes Thema ist, kann diese Antwort als "korrekt" gewertet werden, wenn sie das unmittelbare Problem im Rahmen dieser Frage löst. Versuchen Sie vielleicht, die 'NSNumber'-Methode für Ihre 'UITableViewCell' zu verwenden, da sie' Objective-C' ist. Das Abrufen von Werten in der Benutzeroberfläche unterscheidet sich je nachdem, was Sie tun. Daher würde ich empfehlen, eine weitere Frage zu stellen so viele Informationen wie möglich. –

Verwandte Themen