Я полностью отказался от этого, так что, если модератор придет, удаление было бы здорово.
Не больно оставлять этот вопрос, но CoreData намного лучше, вы знаете?
У меня есть база данных sqlite для обработки содержимого таблицы. Это здорово и все (намного проще, чем другие варианты, которые я смотрел), но у меня проблемы с целыми числами. Когда я впервые запускаю редактирование элемента после запуска приложения, поле для int пустое. Повторный ввод работает нормально, он сохраняется и отображается в таблице, но при следующем редактировании (без повторного открытия приложения) для второго элемента задается значение int для первого.
То есть, A (1) сбрасывается в A (0). Я исправляю это (A (1)), но затем B (2) становится B (1), как только я загружаю представление редактирования. Исправить это (B (2)) или нет (B (1)), C (3) будет иметь тот же (#), что и B.
Я до сих пор не могу понять, что вызвало это. Изменение int на строку (редактирование столбца базы данных и каждого соответствующего файла в приложении), безусловно, будет работать, но это огромная ненужная работа, просто чтобы сделать его медленнее и легче разбивать.
редактирование:
CREATE TABLE "items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" VARCHAR, "need" INTEGER DEFAULT 0, "notes" TEXT)
- (void)updateItemAtIndexPath:(NSIndexPath *)path {
Item *i = (Item *)[items objectAtIndex:path.row];
int ret;
const char *sql = "update items set name = ?, need = ?, notes = ? where id = ?;";
if (!updStmt) { // build update statement
if ((ret = sqlite3_prepare_v2(database, sql, -1, &updStmt, NULL)) != SQLITE_OK) {
NSAssert1(0, @"Error building statement to update items [%s]", sqlite3_errmsg(database));
}
}
// bind values to statement
NSString *s = i.name;
if (s == NULL) s = @"";
sqlite3_bind_text(updStmt, 1, [s UTF8String], -1, SQLITE_TRANSIENT);
NSInteger n = i.need;
sqlite3_bind_int(updStmt, 2, n);
s = i.notes;
if (s == NULL) s = @"";
sqlite3_bind_text(updStmt, 3, [s UTF8String], -1, SQLITE_TRANSIENT);
n = i.itemid;
sqlite3_bind_int(updStmt, 4, n);
// now execute sql statement
if (sqlite3_step(updStmt) != SQLITE_DONE) {
NSAssert1(0, @"Error updating values [%s]", sqlite3_errmsg(database));
}
// now reset bound statement to original state
sqlite3_reset(updStmt);
}
- (void)insertItem:(Item *)item {
int ret;
const char *sql = "insert into items (name, need, notes) values (?, ?, ?);";
if (!insStmt) { // first insert - build statement
if ((ret = sqlite3_prepare_v2(database, sql, -1, &insStmt, NULL)) != SQLITE_OK) {
NSAssert1(0, @"Error building statement to insert item [%s]", sqlite3_errmsg(database));
}
}
// bind values
NSString *s = item.name;
if (s == NULL) s = @"";
sqlite3_bind_text(insStmt, 1, [s UTF8String], -1, SQLITE_TRANSIENT);
NSInteger n = item.need;
sqlite3_bind_int(insStmt, 2, n);
s = item.notes;
if (s == NULL) s = @"";
sqlite3_bind_text(insStmt, 3, [s UTF8String], -1, SQLITE_TRANSIENT);
// execute sql statement
if (sqlite3_step(insStmt) != SQLITE_DONE) {
NSAssert1(0, @"Error inserting item [%s]", sqlite3_errmsg(database));
}
// reset bound statement to original state
sqlite3_reset(insStmt);
[self readItems]; // refresh array
}