Objective c 我无法在objective c中向SQlite数据库插入数据

Objective c 我无法在objective c中向SQlite数据库插入数据,objective-c,ios,xcode,sqlite,insert,Objective C,Ios,Xcode,Sqlite,Insert,可能重复: 我想尝试在sqlite数据库表中插入一些数据,但出现如下错误: ***在-[ViewController按钮单击:]、/Users/ds/Desktop/SqliteDeneme/SqliteDeneme/ViewController.m:57中断言失败 我的代码在这里: - (IBAction)buttonClick:(id)sender { NSString *str1 =@"1"; NSString *str2 =@"1"; NSString *str3 =@"0.1";

可能重复:

我想尝试在sqlite数据库表中插入一些数据,但出现如下错误:

***在-[ViewController按钮单击:]、/Users/ds/Desktop/SqliteDeneme/SqliteDeneme/ViewController.m:57中断言失败

我的代码在这里:

- (IBAction)buttonClick:(id)sender {

NSString *str1 =@"1";
NSString *str2 =@"1";
NSString *str3 =@"0.1";
NSString *str4 =@"0.1";
NSString *str5 =@"0.1";
NSString *str6 =@"0.1";
NSString *str7 =@"deneme";
NSString *str8 =@"1";
NSString *str9 =@"1";
NSString *str10=@"deneme";

NSArray *pathsArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *doumentDirectoryPath=[pathsArray objectAtIndex:0];
destinationPath=[doumentDirectoryPath stringByAppendingPathComponent:@"SqliteTestDb.sqlite"];
NSLog(@"database path %@",destinationPath);

if (sqlite3_open([destinationPath UTF8String], &cruddb)==SQLITE_OK) 
{
    NSLog(@"dataBaseOpen");
    // leak happens here, do stuff then call sqlite3_close(database), or move it out of the if/else block.
    if(stmt == nil) {
        const char *sql = "INSERT INTO LabUpdate (IsSuccess, ProducerId, Latitude, Longitude, Altitude, Slope, SampleDate, PackageNo, Status, Description) VALUES (?,?,?,?,?,?,?,?,?,?)";            
        if(sqlite3_prepare_v2(cruddb, sql, -1, &stmt, NULL) == SQLITE_OK){
            //sqlite3_prepare_v2(cruddb, sql, 1, &stmt, NULL);
            sqlite3_bind_int(stmt, 1, [str1 integerValue]);
            sqlite3_bind_int(stmt, 2, [str2 integerValue]);
            sqlite3_bind_double(stmt, 3, [str3 floatValue]);
            sqlite3_bind_double(stmt, 4, [str4 floatValue]);
            sqlite3_bind_double(stmt, 5, [str5 floatValue]);
            sqlite3_bind_double(stmt, 6, [str6 floatValue]);
            sqlite3_bind_text(stmt, 7, [str7 UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_int(stmt, 8, [str8 integerValue]);
            sqlite3_bind_int(stmt, 9, [str9 integerValue]);
            sqlite3_bind_text(stmt, 10, [str10 UTF8String], -1, SQLITE_TRANSIENT);
        }
        else 
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(cruddb));

    }

    if(SQLITE_DONE != sqlite3_step(stmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(cruddb));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        recordID = sqlite3_last_insert_rowid(cruddb);

    //Reset the add statement.
    sqlite3_reset(stmt);

}
else {
    sqlite3_close(cruddb);
    NSLog(@"dataBaseNotOpen");
    NSAssert1(0, @"Error while opening database '%s'", sqlite3_errmsg(cruddb));

}   

}
我怎样才能解决这个问题?我放了一个断点,我看到它没有在这一行之后输入:

if(sqlite3_prepare_v2(cruddb, sql, -1, &stmt, NULL) == SQLITE_OK){
这是我的数据库表和列:

可能有效吗

if(sqlite3_open([destinationPath UTF8String], &cruddb) ==SQLITE_OK) {

    sqlite3_prepare_v2(cruddb, "BEGIN TRANSACTION", -1, &compiledStmt, NULL);
    sqlite3_step(compiledStmt);
    sqlite3_finalize(compiledStmt);

    const char *sql = "INSERT INTO LabUpdate (IsSuccess, ProducerId, Latitude, Longitude, Altitude, Slope, SampleDate, PackageNo, Status, Description) VALUES (?,?,?,?,?,?,?,?,?,?)"; 
    if(sqlite3_prepare_v2(cruddb, sql, -1, &stmt, NULL) == SQLITE_OK){  

        sqlite3_bind_int(stmt, 1, [str1 integerValue]);
        sqlite3_bind_int(stmt, 2, [str2 integerValue]);
        sqlite3_bind_double(stmt, 3, [str3 floatValue]);
        sqlite3_bind_double(stmt, 4, [str4 floatValue]);
        sqlite3_bind_double(stmt, 5, [str5 floatValue]);
        sqlite3_bind_double(stmt, 6, [str6 floatValue]);
        sqlite3_bind_text(stmt, 7, [str7 UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(stmt, 8, [str8 integerValue]);
        sqlite3_bind_int(stmt, 9, [str9 integerValue]);
        sqlite3_bind_text(stmt, 10, [str10 UTF8String], -1, SQLITE_TRANSIENT);

            NSUInteger err = sqlite3_step(compiledStmt);
            if (err != SQLITE_DONE){
                NSLog(@"error while binding %d %s",err, sqlite3_errmsg(database));
            }
            sqlite3_reset(compiledStmt);
        sqlite3_finalize(compiledStmt);     
    } else {
        NSLog(@"Invalid Query");
    }

    sqlite3_prepare_v2(cruddb, "END TRANSACTION", -1, &compiledStmt, NULL);
    sqlite3_step(compiledStmt);
    sqlite3_finalize(compiledStmt); 
    sqlite3_close(cruddb);

我建议您使用不同的技术来绑定列:

NSString* SQL = [NSString stringWithFormat:@"INSERT INTO table1(col1,col2,col3) VALUES(%i,'%@',%i)",number,Surname,age];
其中数字和年龄是int,姓氏是NSString*(注意格式中字符串周围的引号)

您可以使用如下代码执行此命令:

sqlite3_stmt *queryHandle  = [self prepare:SQL];

if (sqlite3_step(queryHandle) != SQLITE_DONE) 
{
     NSLog(@"ExecuteNonQuery has error");
     NSLog( @"Failed from sqlite3_step. Error is:  %s", sqlite3_errmsg(database) );

}
else
{
    int rowsaffected = sqlite3_changes(database);
}
-(sqlite3_stmt*)prepare:(NSString*)query
{
   sqlite3_stmt *queryHandle;


   const char *sqlStatement = (const char *) [query UTF8String];

   if(sqlite3_prepare_v2(database, sqlStatement, -1, &queryHandle, NULL) != SQLITE_OK) 
   {
       int error = sqlite3_prepare_v2(database, sqlStatement, -1, &queryHandle, NULL);

       NSLog( @"Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(database) );

       NSLog(@"Compiled Statement has error code:%i:%@",error,query);
}

return queryHandle;
一般准备功能如下所示:

sqlite3_stmt *queryHandle  = [self prepare:SQL];

if (sqlite3_step(queryHandle) != SQLITE_DONE) 
{
     NSLog(@"ExecuteNonQuery has error");
     NSLog( @"Failed from sqlite3_step. Error is:  %s", sqlite3_errmsg(database) );

}
else
{
    int rowsaffected = sqlite3_changes(database);
}
-(sqlite3_stmt*)prepare:(NSString*)query
{
   sqlite3_stmt *queryHandle;


   const char *sqlStatement = (const char *) [query UTF8String];

   if(sqlite3_prepare_v2(database, sqlStatement, -1, &queryHandle, NULL) != SQLITE_OK) 
   {
       int error = sqlite3_prepare_v2(database, sqlStatement, -1, &queryHandle, NULL);

       NSLog( @"Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(database) );

       NSLog(@"Compiled Statement has error code:%i:%@",error,query);
}

return queryHandle;
}

这是我使用的方法,速度很快,可以推广到prepare之类的子函数


希望这有帮助。

所以你应该编辑你的原始问题,而不是发布新问题。sqlite3\u prepare\u v2不等于SQLITE\u OK!!请帮助我如何解决?您是否先打开了数据库连接?是的,它已打开。我可以用NSLog(@“dataBaseOpen”)查看;我收到消息:2012-03-30 13:57:22.688 SqliteDeneme[1167:207]无效查询。如何解决查询问题?我错误地设置了其他查询现在检查答案它给出的仍然是无效的查询错误:首先检查表名和数据库中的每个列名。检查拼写alsoI将我的数据库表的打印屏幕添加到我的问题中。我认为栏目名称很清楚。请检查一下。怎么了?