我是ios(Objective-C)和sql和Im的新手,遵循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:action实际更新数据库中的条目而不是仅仅被拒绝? 谢谢!
答案 0 :(得分:0)
“我想扩展它,以便在我尝试输入现有的注册码时,它 将使用新的属性覆盖剩余的属性“
如果这是您要完成的任务,那么您不应该使用INSERT语句。主键的目的是保护数据库免受具有相同主键的重复行的影响。当你这样看时,拒绝是合适的。
您真正想要的是使用INSERT OR REPLACE
如果你是sql和objective c的初学者,我建议我创建一个针对初学者的sqlite包装:TankDB
编辑:
代码示例:
插入或替换studentDetail(regno,name,department,year)值(\“%d \”,\“%@ \”,\“%@ \”,\“%@ \”)“
请参阅this question以确保您实际上并不想使用'UPSERT'。请注意,INSERT OR REPLACE不会使用新信息更新现有行。它将完全删除现有行并替换它。
Edit2:打开,准备,步骤,结束,关闭
const char *dbpath = [_databasePath UTF8String];
if(sqlite3_open(dbpath, &_database) == SQLITE_OK) {
const char *command = [query UTF8String];
// Perform the query
if (sqlite3_prepare_v2(_database, command, -1, &selectstmt, NULL) == SQLITE_OK) {
// For each row returned
while (sqlite3_step(selectstmt) == SQLITE_ROW) {
// Do stuff
}
}
sqlite3_finalize(selectstmt);
}
sqlite3_close (_database);