Проблема с получением данных из SQLite3 на iPhone - PullRequest
1 голос
/ 12 февраля 2010

Я пытался вернуть данные из таблицы после того, как уже получил доступ к двум до нее, но в этом случае он попадает в оператор while, но не присваивает никаких значений, поскольку все установлено на ноль.

Код:

NSMutableArray *all_species = [[NSMutableArray alloc] init];
sqlite3 *db_species;
int dbrc_species;
Linnaeus_LiteAppDelegate *appDelegate = (Linnaeus_LiteAppDelegate*) [UIApplication sharedApplication].delegate;
const char* dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String];
dbrc_species = sqlite3_open (dbFilePathUTF8, &db_species);
if (dbrc_species) {
    return all_species;
}
sqlite3_stmt *dbps_species;
const char *queryStatement = "SELECT species_id, species_name, species_latin, species_genus FROM \
                                linnaeus_species;";
if (sqlite3_prepare_v2 (db_species, queryStatement, -1, &dbps_species, NULL) == SQLITE_OK) {
    sqlite3_bind_int(dbps_species, 1, [the_species_id intValue]);
    while (sqlite3_step(dbps_species) == SQLITE_ROW) {
        Species *species = [[Species alloc] init];
        NSLog(@"%@", sqlite3_column_int(dbps_species, 0));
        [species setSpecies_id:[[NSNumber alloc] initWithInt:sqlite3_column_int(dbps_species, 0)]];
        char *new_name = (char *) sqlite3_column_text(dbps_species, 1);
        [species setSpecies_name:nil];
        if (new_name != NULL) {
            [species setSpecies_name:[NSString stringWithUTF8String:(char *) sqlite3_column_text(dbps_species, 1)]];
        }
        char *new_latin = (char *) sqlite3_column_text(dbps_species, 2);
        [species setSpecies_latin:nil];
        if (new_latin != NULL) {
            [species setSpecies_latin:[NSString stringWithUTF8String:(char *) sqlite3_column_text(dbps_species, 2)]];
        }
        [species setSpecies_genus:[NSNumber numberWithInt:sqlite3_column_int(dbps_species, 3)]];

        [species setEdited:0];
        [all_species addObject:species];
        [species release];
    }
    sqlite3_finalize(dbps_species);
}
else {
    sqlite3_close(db_species);
}

Я также пытался использовать NSLog (@ "Data:% @", sqlite3_column_text (dbps_species, 1)); и это вызывает ошибку EXC_BAD_ACCESS, которая предполагает, что это может быть связано с памятью, но я не понимаю, почему.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010
NSLog(@"Data: %@", sqlite3_column_text(dbps_species, 1));

Будет вызывать EXC_BAD_ACCESS, потому что результатом sqlite3_column_text является строка C (char*), а не NSString*. Для печати строк C вам необходим спецификатор формата %s:

NSLog(@"Data: %s", sqlite3_column_text(dbps_species, 1));

Кроме того, не тратьте время на то, чтобы дважды позвонить sqlite3_column_text, например,

    char *new_name = (char *) sqlite3_column_text(dbps_species, 1);
    [species setSpecies_name:nil];
    if (new_name != NULL) {
        [species setSpecies_name:[NSString stringWithUTF8String:new_name]];
    }
0 голосов
/ 13 февраля 2010

Вы также можете попробовать использовать классы FMDB. Это значительно облегчает использование sqlite.

http://gusmueller.com/blog/archives/2008/03/fmdb_for_iphone.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...