База данных SQLite3 фактически не вставляет данные - iPhone - PullRequest
5 голосов
/ 07 мая 2010

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

Я знаю, что моя база данных загружается, потому что информация для табличного представления (и последующих табличных представлений) загружается из базы данных.Соединение не является проблемой.

Кроме того, журнал sqlite3_last_insert_rowid (db) возвращает правильный номер для следующей строки.Но все же информация не сохраняется.

Вот мой код:

db = [Database openDatabase];           
NSString *query = [NSString stringWithFormat:@"INSERT INTO lists (name) VALUES('%@')", newField.text];
NSLog(@"Query: %@",query);

sqlite3_stmt *statement;

if (sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
  if (sqlite3_step(statement) == SQLITE_DONE){
    NSLog(@"You created a new list!");
    int newListId = sqlite3_last_insert_rowid(db);
    MyList *newList = [[MyList alloc] initWithName:newField.text idNumber:[NSNumber numberWithInt:newListId]];
    [self.listArray addObject:newList];
    [newList release];
    [self.tableView reloadData];
    sqlite3_finalize(statement);
  }
  else {
    NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(db));
  }
}
[Database closeDatabase:db];

Опять же, никаких ошибок не было.Операторы prepare и step возвращают SQLITE_OK и SQLITE_DONE соответственно, но ничего не происходит.

Любая помощь приветствуется!

Ответы [ 3 ]

7 голосов
/ 11 августа 2010

Убедитесь, что вы переместили базу данных в доступный для записи каталог, такой как NSDocumentDirectory и NSLibraryDirectory.

Файл базы данных, который вы видите в XCode, находится в MainBunble, который доступен для чтения, но не для записи.

Вам необходимо добавить метод для проверки во время выполнения, существует ли база данных в выбранном вами месте (для записи), если она не существует, используйте NSFileManager, чтобы скопировать файл базы данных в путь каталога для записи.

Вот фрагмент из моего приложения. Snap-it Notes:

+ (BOOL)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    BOOL success;
    BOOL newInstallation;
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"database_file_path"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    newInstallation = !success;
    if (success) {
        [fileManager release];
        return newInstallation;
    }
    // The writable database does not exist, so copy the default to the appropriate location.
    //NSLog(@"database does not exist");
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database_file_path"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    [fileManager release];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
    return newInstallation;
}
0 голосов
/ 29 июля 2010

Отсутствует точка с запятой в вашем выражении SQLite?

NSString *query = [NSString stringWithFormat:@"INSERT INTO lists (name) VALUES('%@')", newField.text];

Я считаю, что это должно быть:

NSString *query = [NSString stringWithFormat:@"INSERT INTO lists (name) VALUES('%@');", newField.text];

Хотя это может быть не единственной вашей проблемой.

0 голосов
/ 07 мая 2010

Вы должны зафиксировать перенос после вставки, используя оператор COMMIT;.

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