库程序不按顺序调用

时间:2011-04-01 08:13:49

标签: iphone sqlite

我想在iphone上写入sqlite中的数据库,我想在数据库中输入3个值。鉴于以下是我的代码,但我收到以下sqlite错误消息:

-(void) writeintoDatabase:(id)value1:(id)value2:(id)value3 {
sqlite3 *database;


    const char *sql = "insert into UserData(firstName,lastName,userName) Values(?, ?, ?)";
    sqlite3_stmt *insert_statement;
    sqlite3_prepare_v2(database, sql, -1, &insert_statement, NULL);

    sqlite3_bind_text(insert_statement, 1, [value1 UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insert_statement, 2, [value1 UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insert_statement, 3, [value1 UTF8String], -1, SQLITE_TRANSIENT);

    NSInteger keyID;
printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) ); 

        keyID = sqlite3_last_insert_rowid(database);


    sqlite3_reset(insert_statement);

}

4 个答案:

答案 0 :(得分:5)

谢谢mmcomb,谢谢你。从你的建议我完全解决了这个问题。

  • 首先我没有检查数据库路径,然后打开 连接。

  • 准备好声明并绑定后,
  • 其次 在调用之前我必须调用sqlite3_step sqlite3_last_insert_rowid

  • 第三我需要致电sqlite3_finalize以释放资源。

  • 第四次我需要sqlite3_close连接。

'库例程调用失序'错误是由于没有正确打开和关闭连接。

这是正确的代码:

NSInteger keyID; // in .h class
NSMutableArray *user;// in .h class

-(void) writeintoUserDatabase:(NSString*)value1:(NSString*)value2:(NSString*)value3 
{
sqlite3* database;
databaseName = @"UserData";// create a db with this name and keep it in app resources folder
NSString *pathToDatabase;
NSArray *documentPaths =         NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
pathToDatabase = [documentsDir stringByAppendingPathComponent:databaseName];
int databaseReturnCode = sqlite3_open([pathToDatabase UTF8String], &database);
NSLog(@"databaseReturnCode %d",databaseReturnCode);
if(databaseReturnCode == SQLITE_OK) {

const char *sql = "insert into UserData(firstName,lastName,userName) Values(?, ?, ?)";
sqlite3_stmt *insert_statement;
    sqlite3_prepare_v2(database, sql, -1, &insert_statement, NULL);

    sqlite3_bind_text(insert_statement, 1, [value0 UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insert_statement, 2, [value1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(insert_statement, 3, [value2 UTF8String], -1, SQLITE_TRANSIENT);

printf( "is there an error?: %s\n", sqlite3_errmsg(database) ); 

    while(sqlite3_step(insert_statement) == SQLITE_ROW) 
    {
        NSString *aFirstName  = [NSString stringWithUTF8String:      (char*)sqlite3_column_text(insert_statement, 1)];
        NSString *aLastName  = [NSString stringWithUTF8String:(char *)sqlite3_column_text(insert_statement, 2)];
        NSString *aUserName  = [NSString stringWithUTF8String:(char *)sqlite3_column_text(insert_statement, 3)];
users = [[NSMutableArray alloc]initWithObjects:aFirstName,aLastName,aUserName,nil];
    }

keyID = sqlite3_last_insert_rowid(database);


    sqlite3_reset(insert_statement);

sqlite3_finalize(insert_statement);

}
sqlite3_close(database);    
}

答案 1 :(得分:2)

您的代码缺少对sqlite3_step的调用。在准备好语句并绑定适当的变量之后,在调用sqlite3_last_insert_rowid之前,需要调用它。

查看sqlite3_step的文档了解详情,始终检查此类功能返回的错误代码。

如果没有发生错误,请不要调用sqlite3_errormsg,在这种情况下,结果是未定义的。

最后,如果你没有在某个地方处理它,你需要在语句中调用sqlite3_finalize。否则你会遇到资源泄漏并最终崩溃。 sqlite3_reset不释放资源,它只是“清理”语句,因此您可以使用不同的绑定值重新运行它。

答案 2 :(得分:1)

在准备sqlite stament / query之前,您需要打开与数据库的连接...

sqlite3* database;
NSString pathToDatabase = @"/blah/blah/database.db";
const char* pathToDatabaseUTF8 = [databasePath UTF8String];
databaseReturnCode = sqlite3_open(pathToDatabaseUTF8, &database);

有关详细信息,请参阅sqlite文档了解sqlite3_open方法。

哦,别忘了关闭那个连接......

int sqlite3_close(database);

答案 3 :(得分:0)

在我的情况下,它是一个包含一些特殊字符的字符串,就像它是(')单冒号我用(“”)替换它一个空格,它开始工作。 [[[object objectAtIndex:locBtn.tag] valueForKey:@“description”] stringByReplacingOccurrencesOfString:@“'”withString:@“”]