从 sqlite3 数据库中删除某些行
Posted
技术标签:
【中文标题】从 sqlite3 数据库中删除某些行【英文标题】:delete certain rows from sqlite3 database 【发布时间】:2011-11-27 21:52:41 【问题描述】:我正在尝试从我的数据库中删除创建行。但它没有这样做,所以我的表格中有重复的日期特定内容,所以我想删除特定日期的条目并在每次建立连接时添加它们
我的代码是:
static sqlite3 *database = nil;
static sqlite3_stmt *deleteStmt = nil;
- (NSString *)dataFilePath
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"person.sqlite3"];
NSDate *today = [NSDate date];
NSLog(@"%@", today);
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yy"];
if (sqlite3_open([[self dataFilePath] UTF8String], &database)
!= SQLITE_OK)
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
NSString * dateString = [dateFormat stringFromDate:today];
if(deleteStmt == nil)
const char *sql = "delete from SHOPPER where DATE = ?";
if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 3, [dateString UTF8String],-1, NULL);
if (SQLITE_DONE != sqlite3_step(deleteStmt))
NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));
sqlite3_reset(deleteStmt);
sqlite3_close(database);
【问题讨论】:
【参考方案1】:sqlite3_bind_text 的第二个参数应该是 1,而不是 3。 这意味着'?'的索引准备好的语句中的字符,以及 因为只有一个“?”在你的删除语句中,它必须是 1。
//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 1, [dateString UTF8String], -1, NULL);
那么,为什么要将 deleteStmt 声明为静态,并且只创建一次? 我认为它应该为开放数据库创建,因为你打开 并每次关闭数据库,您应该创建(并完成,而不是重置) 每次都删除Stmt。
【讨论】:
以上是关于从 sqlite3 数据库中删除某些行的主要内容,如果未能解决你的问题,请参考以下文章
从 sqlite3 数据库上的表单提交中的 sqlalchemy 行更新行为不一致