我想在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);
}
答案 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:@“”]