данные не вставляются из этого запроса вставки - PullRequest
0 голосов
/ 24 сентября 2011

Я использую этот код для вставки данных в мою базу данных

, но он не работает ..

Мои данные не вставляются в таблицу ..

в чем может быть проблема ??

в function.h

 +(BOOL)insertStudentinfoData:(NSString *)first_name last_name:(NSString *)last_name phone_num:(NSString *)phone_num;

в function.m

 +(BOOL)insertStudentinfoData:(NSString *)first_name last_name:(NSString *)last_name phone_num:(NSString *)phone_num
  {
    NSString *sql = [NSString stringWithFormat:@"insert into add_data   
    values(NULL,'%@','%@','%@')",first_name,last_name,phone_num];
    return [DBOperation executeSQL:sql];
 }

И я даю данные из этого

[Function insertStudentinfoData:@"hello" last_name:@"w3qrq" phone_num:@"efew"];

но мои данные не вставляются в таблицу

//// В DBOperation.h

    +(BOOL) executeSQL:(NSString *)sqlTmp {

if(conn == SQLITE_OK) {
    NSLog(@"\n\n%@",sqlTmp);       

    const char *sqlStmt = [sqlTmp cStringUsingEncoding:NSUTF8StringEncoding];
    sqlite3_stmt *cmp_sqlStmt1;
    int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt1, NULL);

    returnValue == SQLITE_OK ?  NSLog(@"\n Inserted \n") :NSLog(@"\n Not Inserted \n");

    sqlite3_step(cmp_sqlStmt1);
    sqlite3_finalize(cmp_sqlStmt1);

    if (returnValue == SQLITE_OK) {
        return TRUE;
    }
}
return FALSE;

}

Ответы [ 4 ]

1 голос
/ 25 сентября 2011

Я предполагаю, что вы передаете значение NULL для PRIMARY KEY, сначала сбросьте симулятор

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

NSString *sql = [NSString stringWithFormat:@"INSERT INTO add_data 
                     (first_name,last_name,phone_num) VALUE('%@','%@','%@')",first_name,last_name,phone_num];

или

NSString *sql =[NSString stringWithFormat:@"INSERT INTO add_data 
(first_name,last_name,phone_num,email,address,city,zip) VALUES 
('%@','%@','%@','%@','%@','%@','%@');",first_name,last_name,phone_num,email,addr‌​ess,city,zip];
0 голосов
/ 24 сентября 2011

Что если вы предоставите имена столбцов для вставки:

                 insert into T (foo, bar, baz)
                 values( ....)
0 голосов
/ 24 сентября 2011

Попробуйте, чтобы увидеть полный код ошибки и сообщение:

sql поставляется как NSString *, не конвертируйте его в cstring.

int rc;
sqlite3_stmt *sel;

if ((rc = sqlite3_prepare_v2(db_handle, [sql UTF8String], -1, &sel, NULL)) != SQLITE_OK) {
    NSLog(@"cannot prepare '%@': %d (%s)", sql, rc, sqlite3_errmsg(db_handle));
    return;
}

if (sqlite3_step(sel) != SQLITE_DONE) {
    NSLog(@"error insert/update: '%s'", sqlite3_errmsg(db_handle));
...
0 голосов
/ 24 сентября 2011

Вы уверены, что база данных инициализирована правильно?У меня всегда были проблемы с БД на самом деле не там.Какую БД Framework вы используете?

[EDIT] вы видите этот оператор журнала?NSLog (@ "\ n \ n% @", sqlTmp);
Вы сами написали класс DBOperations?Я думаю, что есть некоторая проблема с статической переменной, которую вы используете.Я бы посоветовал либо использовать существующую структуру базы данных, такую ​​как fmdb, либо что-то еще, либо изменить ваш класс так, чтобы он использовал шаблон Singleton.

О, и одно: вы вызываете все методы из одного потока?БД SQlite не являются поточно-ориентированными!

[edit2] Вы можете использовать приведенную здесь ссылку: Ошибка SQLite3 - iOS , чтобы проверить, что на самом деле указывает значение в returnValue, а затем выяснить, что лежитошибка.Вероятно, сейчас лучше изменить не вставленное утверждение следующим образом:

 returnValue == SQLITE_OK ?  NSLog(@"\n Inserted \n") :NSLog(@"\n Not Inserted with code: %i\n",returnValue);
...