我是使用sqlite和iPhone的新手,我在添加记录到数据库时遇到了一些麻烦。我已经使用了我可以在网上尝试解决这个问题,但我陷入了困境。
我正在使用这段代码尝试在sqlite中将记录添加到数据库中:
-(void)insertData{
sqlite3 *database;
sqlite3_stmt *statement;
NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"ProductDatabase" ofType:@"sql"];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
//nutrional values
float caloriesFloat = [caloriesTextField.text floatValue];
float saturatesFloat = [saturatesTextField.text floatValue];
float fatFloat = [fatTextField.text floatValue];
float fibreFloat = [fibreTextField.text floatValue];
float sugarFloat = [sugarTextField.text floatValue];
float saltFloat = [saltTextField.text floatValue];
NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO products (name,category,calories, saturates,fat,fibre,sugar,salt) VALUES ('%@',' %@','%.02f','%.02f','%.02f','%.02f','%.02f','%.02f',);",nameTextField.text, categoryLabel.text, caloriesFloat, saturatesFloat, fatFloat, fibreFloat, sugarFloat, saltFloat];
const char *insert_stmt = [insertSQL UTF8String];
if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK)
{
sqlite3_bind_text(statement, 1, [nameTextField.text UTF8String], -1, NULL);
sqlite3_bind_text(statement, 2, [categoryLabel.text UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", caloriesFloat] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saturatesFloat] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fatFloat] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fibreFloat] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", sugarFloat] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saltFloat] UTF8String], -1, NULL);
}
if(sqlite3_step(statement)==SQLITE_DONE)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
alert=nil;
}
// Release the compiled statement from memory
sqlite3_finalize(statement);
sqlite3_close(database);
}
}
警告视图“未添加产品”总是出现,有人可以解释为什么我的记录没有添加?
谢谢,
杰克
答案 0 :(得分:2)
这是因为您直接在资源文件夹中将数据写入database
。首先您需要复制database
中的document directory
。
NSString *databasePath=[[NSBundle mainBundle]pathForResource:@"ProductDatabase" ofType:@"sql"];
在上面的行
之后添加下面的代码NSError *err=nil;
NSFileManager *fm=[NSFileManager defaultManager];
NSArray *arrPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, -1);
NSString *path=[arrPaths objectAtIndex:0];
NSString path2= [path stringByAppendingPathComponent:@"ProductDatabase.sql"];
if(![fm fileExistsAtPath:path2])
{
bool success=[fm copyItemAtPath:databasePath toPath:path2 error:&err];
if(success)
NSLog(@"file copied successfully");
else
NSLog(@"file not copied");
}
并从代码中删除绑定语句并将其更改为
if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK)
{
if(sqlite3_step(statement)==SQLITE_DONE)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
alert=nil;
}
}
答案 1 :(得分:1)
首先,将数据库复制到文档。您无法在主包中修改它。
其次,有两种方法可以在sqlite3数据库上创建和执行sql语句。
一种方法是使用字符串操作创建整个sql字符串(us%,%d等用于添加字符串和数值)并在db上执行sql。
另一种方法是在sql字符串中为每个变量设置一个问号(?),并将变量绑定到每个变量?使用sqlite3_bind语句
每种方法都有它的优缺点,但你可以选择你想要的方法。 你的代码中的东西都是错误的
此外,如果要将其绑定到语句,则无需将每个数值转换为字符串。你可以使用sqlite3_bind_int,sqlite3_bind_double等。