Sqlite вставки теряются после перезапуска приложения - PullRequest
1 голос
/ 28 июня 2011

Это код вставки. Он работает нормально, пока я не закрою приложение и не запустлю его снова, тогда все изменения пропали. Я не вижу никакой ошибки, это может быть какая-то специфическая проблема для iphone?

const char *sql = "INSERT INTO offers "
                  "(OfferId, AddressId, ShortDescription, LongDescription, TimeStart, TimeEnd, Created, LastEdit) "
                  " VALUES (?, ?, ?, ?, ?, ?, ?, ?)";


sqlite3_stmt *stmt;
int returnValue = sqlite3_prepare(db, sql, -1, &stmt, NULL);
if(returnValue == SQLITE_OK) {
    for(NSDictionary *offer in offers) {
        sqlite3_bind_int(stmt, 1, [[offer valueForKey:@"OfferId"] intValue]);
        sqlite3_bind_int(stmt, 2, [[offer valueForKey:@"AddressId"] intValue]);
        sqlite3_bind_text(stmt, 3, [[offer valueForKey:@"ShortDescription"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 4, [[offer valueForKey:@"LongDescription"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(stmt, 5, [[offer valueForKey:@"TimeStart"] intValue]);
        sqlite3_bind_int(stmt, 6, [[offer valueForKey:@"TimeEnd"] intValue]);
        sqlite3_bind_int(stmt, 7, [[offer valueForKey:@"Created"] intValue]);
        sqlite3_bind_int(stmt, 8, [[offer valueForKey:@"LastEdit"] intValue]);

        if(sqlite3_step(stmt) != SQLITE_DONE)
            NSLog(@"instertOffers -> sql-error: %s", sqlite3_errmsg(db));
        else
            NSLog(@"added offer with id: %@", [offer valueForKey:@"OfferId"]);

        sqlite3_reset(stmt);
    }
} else {
    NSLog(@"instertOffers -> sql-error: %s", sqlite3_errmsg(db));
}

sqlite3_finalize(stmt);
sqlite3_close(db);

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Является ли файл базы данных SQLite в AppBundle, если это так, вам нужно будет скопировать его в каталог документов, если вы хотите внести изменения. Вы не можете записывать файлы в ваш пакет приложений.

1 голос
/ 28 июня 2011

Чтобы записать вашу БД в файловый менеджер:

NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbPath = [self getDatabasePath];
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"yourDB.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if (!success) 
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }

Чтобы извлечь вашу БД из файлового менеджера:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"yourDB.sqlite"];

Таким образом, ваши изменения будут сохранены при следующем открытииваша БД.Я бы предпочел использовать обертку FMDatabase, написанную на Obj C поверх sqlite.Вот ссылка для FMDatabase: http://code.google.com/p/flycode/source/browse/trunk/fmdb

надеюсь, это поможет !!

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