Оператор вставки iPhone SQlite выполняется только один раз - PullRequest
0 голосов
/ 29 января 2011

Я использую старый способ хранения данных в моем приложении, используя вызовы sqlite3. Я запускаю это приложение на симуляторе iphone (4.1)

Приложение представляет собой контроллер представления панели вкладок с первым видом контроллера представления навигации, который выдвигает другой контроллер представления, в котором выполняется вставка.

Вставка добавляет одну запись в базу данных

  1. Я скопировал файл базы данных sqlite в область доступных для записи документов
  2. База данных открывается в appDelegate и используется контроллером представления, выполняющим вставку
  3. Сами операторы вставки успешно выполнены без ошибок

Я вручную прошел путь к файлу sqlite db, используемому симулятором, и вижу только одну записанную запись.

Приложение по какой-то странной причине записывает и сохраняет запись в базу данных только при первом запуске приложения. Все последующие записи не могут быть найдены.

код для вставной части

-(void) insertNewPerson:(ABRecordRef)person
{
    CFStringRef fName, lName;

    fName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    lName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSNumber *addressbookID = [NSNumber numberWithInteger: ABRecordGetRecordID(person)];
    FunTimeAppDelegate *appDelegate = (FunTimeAppDelegate *)[[UIApplication sharedApplication] delegate];
    static char *sql = "INSERT INTO contacts_main (uuid,abid,firstname,lastname,organisation) VALUES ('13568',?,?,?,'FunTime')";
    if (sqlite3_prepare_v2(appDelegate.database, sql, -1, &insert_statement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(appDelegate.database));
    }
    else {
        sqlite3_bind_int(insert_statement, 1,addressbookID);
        sqlite3_bind_text(insert_statement, 2,[fName UTF8String],-1,SQLITE_STATIC);
        sqlite3_bind_text(insert_statement, 3,[lName UTF8String],-1,SQLITE_STATIC);

        int success = sqlite3_step(insert_statement);
        if (success != SQLITE_ERROR) {
            NSLog(@"SQLITE statement executed - new person added to database");
            NSLog(@"last inserted row id %d",sqlite3_last_insert_rowid(appDelegate.database));
            sqlite3_reset(insert_statement);
            sqlite3_finalize(insert_statement);
            NSLog(@"reset");
        }
        else{
            NSLog(@"SQLITE statement execution error");
            NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(appDelegate.database));
        }
    }
}
...