未插入此插入查询的数据

时间:2011-09-24 12:54:13

标签: iphone database sqlite insert

我正在使用此代码在我的数据库中插入数据

但它不起作用..

我的数据未插入表中..

可能是什么问题??

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 个答案:

答案 0 :(得分:1)

我猜你正在传递PRIMARY KEY的NULL值,首先重置模拟器

  

如果您没有指定列名并插入值,那么您应该按照创建的列的特定顺序传递每列的值,否则最好指定列

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];

答案 1 :(得分:0)

您确定数据库是否已正确初始化?我总是遇到DB实际上没有问题。您使用的是哪个DB Framework?

[编辑]你看到这个日志声明吗?     的NSLog(@ “\ n \ n%@”,sqlTmp);
你自己写过DBOperations课了吗?我认为你使用的静态变量存在一些问题。我建议使用像fmdb之类的现有数据库框架,或者修改你的类以便它使用Singleton模式。

哦,还有一件事:你是否在同一个线程中调用所有方法? SQlite DB不是线程安全的!

[edit2]您可以使用此处提供的链接:SQLite3 error - iOS来检查returnValue中的值实际指示的内容 - 然后找出潜在的错误。 现在最好修改你未插入的语句,如下所示:

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

答案 2 :(得分:0)

如果您提供要插入的列的名称,该怎么办:

                 insert into T (foo, bar, baz)
                 values( ....)

答案 3 :(得分:0)

以这种方式尝试查看完整的错误代码和消息:

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));
...