【发布时间】:2013-10-10 18:30:11
【问题描述】:
我是 ios (Objective-C) 和 sql 的超级新手,我按照这里的 sqlite(特别是 sqlite3)教程进行操作:http://www.tutorialspoint.com/ios/ios_sqlite_database.htm 我正确地实施了一切。问题是,如果我尝试使用相同的 reg id(用于在数据库中查找元素的主键)输入信息,它会抱怨该键不是唯一的。
- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name
department:(NSString*)department year:(NSString*)year;
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString *insertSQL =
[NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values (\"%d\",\"%@\", \"%@\", \"%@\")",[registerNumber integerValue], name, department, year];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
int s = sqlite3_step(statement);
const char *errmsg = sqlite3_errmsg(database);
if (s == SQLITE_DONE)
{
sqlite3_reset(statement);
return YES;
}
else {
sqlite3_reset(statement);
return NO;
}
}
return NO;
}
如何进行 saveData: 操作实际更新数据库中的条目,而不是仅仅被拒绝? 谢谢!
【问题讨论】:
-
数值不加引号。并且字符串值必须用单引号,而不是双引号。但更重要的是,不要使用
stringWithFormat来构建您的查询。使用sqlite3_bind_xxx正确绑定值。 -
由于每次都打开数据库,所以还需要关闭数据库。您还应该完成声明。无需重置语句,因为您没有重用它们。您还需要检查
sqlite3_prepare_v2的返回值。使用sqlite3_errmsg()检查任何失败的呼叫。 -
@rmaddy 代码按照最初的预期工作,引入了一个简单的 sql 数据库结构,但我想扩展它,以便如果我尝试输入现有的 reg id,它将覆盖其余属性与新属性。我会考虑使用绑定函数,但就格式而言,我相当确定对于 obj-c,我对字符串和数字使用了正确的语法,但如果我错了,请纠正我。
-
使用 FMDatabase 框架,很容易在表中插入值。
标签: ios sqlite sql-update