Ошибка вставки SQLite "Сбой ограничения" - PullRequest
0 голосов
/ 05 августа 2011

У меня проблемы при вставке данных в таблицу sqlite, я прочитал много сообщений, но все еще не нашел решения, надеюсь, вы мне поможете.

Мое определение таблицы:

CREATE TABLE "forum_topics" ("id" INTEGER (11) PRIMARY KEY  NOT NULL  UNIQUE  DEFAULT 1, "id_user" INTEGER (11) NOT NULL  DEFAULT 0, "title" TEXT NOT NULL  DEFAULT None, "description" TEXT NOT NULL  DEFAULT None)

У меня возникла эта проблема при выполнении следующей функции:

- (void)addTopic{
    if (addStmt == nil) {
        const char *sql = "INSERT INTO forum_topics (id_user, title, description) VALUES (?, ?, ?)";
        if (sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) {
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }
    }
    sqlite3_bind_int(addStmt, 1, id_user);
    sqlite3_bind_text(addStmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStmt, 3, [desc UTF8String], -1, SQLITE_TRANSIENT);


    if (SQLITE_DONE != sqlite3_step(addStmt)) {
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    }
    else {
        self._id = sqlite3_last_insert_rowid(database);
    }
    sqlite3_reset(addStmt);
    sqlite3_finalize(addStmt);
    addStmt = nil;
}

Ну, я также пытался принудительно связать столбец id таблицы, и она не вылеталанесмотря на то, что id имеет PRIMARY KEY и UNIQUE ограничения, и предполагается, что они не устанавливаются ... Есть предложения?Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Можете ли вы сказать нам, какую ошибку вы получаете? Является ли ваша переменная id_user вещественным целым числом, если нет, то i = [id_user intValue];

Поскольку идентификатор столбца SQL-ошибок не является уникальным при повторной вставке строки.

Вы вставляете новую запись, указав имя столбца, но не указываете значение для столбца 'id', поэтому в нем принимается значение по умолчанию 1, но для которого уже установлена ​​таблица при вставке первой записи.

INSERT INTO forum_topics (id_user, title, description) VALUES (2, 'A', 'A'); // самый первый раз

но когда вы вставляете второй раз, вы не указываете значение для столбца 'id', и значение по умолчанию для этого столбца равно 1 (но оно уже сохраняется при первой вставке записи) . поэтому, если вы хотите избежать, вы должны указать уникальное значение столбца 'id'

INSERT INTO forum_topics (id, id_user, title, description) VALUES (2,2, 'A', 'A'); // теперь это успешно вставит строку. Измените схему на

CREATE TABLE "forum_topics" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "id_user" INTEGER (11) NOT NULL  DEFAULT 0, "title" TEXT NOT NULL  DEFAULT None, "description" TEXT NOT NULL  DEFAULT None);
0 голосов
/ 05 августа 2011

Убедитесь, что строковое значение, если оно содержит ', строка запроса не будет завершена. Просто замените ' на ' '. Если возможно для вас. вы отправите строку запроса со значениями, которые будут сохранены?

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