【发布时间】:2012-01-23 13:28:55
【问题描述】:
我使用以下语句创建了一个 sqlite 表:
"CREATE TABLE IF NOT EXISTS reminders (ID INTEGER PRIMARY KEY,Name VARCHAR(64), Event VARCHAR(64), Date VARCHAR(64), Bfr VARCHAR(64), Val VARCHAR(64),Num VARCHAR(64), Bod VARCHAR(400) ,Grp VARCHAR(64))";
我已经成功地插入数据并从 sqlite 数据库中检索数据,并以编程方式在视图提醒中显示提醒!
但我对从 sqlite 数据库中删除记录感到震惊。我的意思是我使用模型类来保存名称、事件、日期等值...在添加提醒页面中,我已经为变量分配了值在模型类中声明,即
textField.text = remClass.Name 等等。
我的描述可能听起来令人困惑,但上述信息总是有助于轻松回答这个问题。
我添加了提醒页面,用户在其中输入数据并单击保存,然后将数据插入到数据库中。有查看提醒页面,用户可以在其中查看已保存的提醒。有 3 种不同的方式查看提醒: viewAll,viewMonthly,viewGroup.Now 在视图中,我可以使用以下语句显示每个提醒的唯一 ID:
ReminderClass *loadedReminder = [[ReminderClass alloc] init];
loadedReminder.reminderID = sqlite3_column_int(statement, 0);
提醒类是一个模型类,它保存在添加提醒页面中输入的所有值。
为了显示保存的提醒,我使用了一个数组并在检索每一行后添加了模型类对象,即id、name、event、date 等。并相应地填充表格视图。说如果我保存 3 个提醒,那么部分是 3 个明智的,依此类推...
现在如果我点击视图组提醒页面中的编辑按钮,那么我们知道我们可以通过点击左侧的方向按钮来删除表格视图的行(部分)。
如果我删除该行,说一行有提醒。那么与该提醒对应的数据也应该从sqlite数据库中删除。
我该怎么做,我已经完成了这个 link 听起来与我的要求相似。但它不起作用。
最后我实现了以下删除代码:
if (editingStyle == UITableViewCellEditingStyleDelete)
{
[self.grpArray objectAtIndex:indexPath.section];
if(sqlite3_open([databasePath UTF8String], &remindersDB)==SQLITE_OK)
{
sqlite3_stmt *compiledstatement;
int pk = sqlite3_column_int(compiledstatement, 0);
NSString *querySQL = [NSString stringWithFormat:@"delete from reminders where ID = %i",pk];
const char *sqlstmt=[querySQL UTF8String];
if(sqlite3_prepare_v2(remindersDB, sqlstmt, -1, &compiledstatement, NULL)==SQLITE_OK)
{
if(SQLITE_DONE != sqlite3_step(compiledstatement))
NSAssert1(0,@"Error while creating delete statement => %s",sqlite3_errmsg(remindersDB));
}
NSLog(@"delete DONE");
sqlite3_finalize(compiledstatement);
}
sqlite3_close(remindersDB);
[self.gTable reloadData];
}
检索代码:
-(void)loadgReminders
{
EventsReminderAppDelegate *appDelegate = (EventsReminderAppDelegate *)[[UIApplication sharedApplication]delegate];
NSLog(@"String = %@",appDelegate.groupString);
self.grpArray = nil;
self.grpArray = [[NSMutableArray alloc]init];
//Retrieve the group of reminder
const char *thePath = [self.databasePath UTF8String];
sqlite3_stmt *statment;
if (sqlite3_open(thePath, &remindersDB) == SQLITE_OK)
{
NSString *getQuery = [NSString stringWithFormat:@"SELECT * FROM reminders WHERE Grp = '%@' ORDER BY Date ASC",appDelegate.groupString];
const char *sqlite_stmt = [getQuery UTF8String];
if (sqlite3_prepare_v2(self.remindersDB, sqlite_stmt, -1, &statment, NULL) == SQLITE_OK)
{
while (sqlite3_step(statment) == SQLITE_ROW)
{
ReminderClass *remind = [[ReminderClass alloc]init];
remind.reminderID = sqlite3_column_int(statment, 0);
**NSLog(@"reminderID=%d",remind.reminderID);**
remind.Name = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 1)];
remind.Event = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 2)];
remind.Date = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 3)];
remind.numDays = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 4)];
remind.selString = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 5)];
remind.number = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 6)];
remind.msgBody = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 7)];
remind.remGroup = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statment, 8)];
NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [dateFormat dateFromString:remind.Date];
[dateFormat setDateFormat:@"MMMM dd"];
NSString *dateVal = [dateFormat stringFromDate:date];
remind.Date = dateVal;
[self.grpArray addObject:remind];
[remind release];
}
sqlite3_finalize(statment);
}
sqlite3_close(remindersDB);
}
}
我使用 NSLog 来检查提醒 ID 值是否正确显示:
但是,当我尝试对删除执行相同操作以检索 id 值并将该 id 值分配给 where id=? 时,出了什么问题。
它不起作用,我哪里错了?
谁能帮帮我?
【问题讨论】:
-
@Jennis 感谢您的关注...实际上行和记录并没有被删除
标签: ios uitableview sqlite sql-delete