2012-03-06 72 views
0

我有一个窗体包含文本字段,一个textView和2个开关。现在我使用sqlite数据库将数据保存到数据库中。每件事情都很好,文本字段,文本视图保存,检索,甚至显示保存。我们知道我们没有任何称为复选框的功能,我们需要使用行为/复选框功能的开关。现在,在保存开关状态我将它保存为字符串/文本格式只,即检查开关的状态,为ON分配值为'1',OFF为'0'为整数。现在您可能会有点困惑如何将整数保存为字符串格式,是的,您是对的! int值到数字,最后数字到字符串。然后我形成了查询,并将值插入到sqlite数据库表中。 这里是它的清醒的认识的代码片段:保存UISwitch状态到sqlite数据库并访问相同的显示

int smsValue = 0; 

    if ([smsSwitch isOn]) 
    { 
     smsValue = 1; 
    } 

    else 
    { 
     smsValue = 0; 
    } 

    NSNumber *smsNum = [NSNumber numberWithInt:smsValue]; 
    NSString *selectedVal = [smsNum stringValue]; 

的selectedVal是什么,我们要传递的字符串而形成的查询,我也发现了,国家正越来越妥善保存,即。该值是正确的。

现在我有一个要求,在我的表单中我有开关短信,最初该开关的状态是关闭,在关闭状态,最后2个字段,即textField和textView隐藏。如果用户选择它状态为ON),那么这两个字段被认为是开放的以输入值。

完全我保存了3个提醒,其中我用短信保存了2个,用短信保存了2个,两个字段(最后一个)都填充了。现在通过数据或保存跟踪保存后的记录形成我用一个模型类,请参见下面的代码片段清晰的认识......我怎么还通过了其他领域(文本框)值:

-(void)viewDidLoad 
{ 
    textField.text = reminderInstance.Name; 
    textField1.text = reminderInstance.Event; 
    textField2.text = reminderInstance.Date; 
    textField3.text = reminderInstance.numDays; 
    textField4.text = reminderInstance.remGroup; 

    [super viewDidLoad]; 
} 

这里reminderInstance就像模型类固定值的对象名称,事件,日期等...现在最后2个字段,即textField5和textView绑定或链接到短信开关的状态。如果它被选中,我们需要考虑这两个字段值并传递它们供用户编辑/进行更改。如果不是,我们不需要麻烦最后2场。

下面是开关的操作:

-(IBAction)toggleEnabledForswitch:(id)sender 
{ 
    if(smsSwitch.on) 
    { 
     textField5.hidden = NO; 
     textView.hidden = NO; 
    } 

    else 
    { 
     textField5.hidden = YES; 
     textView.hidden = YES; 
    } 
} 
在保存操作

现在,我检查了开关的状态,并相应地保存值,下面的代码片段将显示出清晰的画面:

-(IBAction)save:(id)sender 
{ 
int smsValue = 0; 

    if ([smsSwitch isOn]) 
    { 
     smsValue = 1; 
    } 

    else 
    { 
     smsValue = 0; 
    } 

    NSNumber *smsNum = [NSNumber numberWithInt:smsValue]; 
    NSString *selectedVal = [smsNum stringValue]; 

    reminderInstance.smsString = selectedVal; 
sqlite3_stmt *statement = nil; 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK && textField.text != nil) 
    { 
     if (self.navigationItem.rightBarButtonItem.title == @"Save" && [textField.text length] !=0 && [textField1.text length] !=0 && [textField2.text length] !=0 && [textField3.text length] !=0 && [textField4.text length] !=0) 
     { 
      NSLog(@"am in the save loop"); 

      if (smsValue == 0) 
      { 
       NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO reminders(name,event,date,bfr,grp,val,sms) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", textField.text, textField1.text,textField2.text,textField3.text,textField4.text,isSelected,selectedVal]; 
       const char *insert_stmt = [insertSQL UTF8String]; 
       sqlite3_prepare_v2(remindersDB, insert_stmt, -1, &statement, NULL); 
      } 

      else if (smsValue == 1) 
      { 
       NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO reminders(name,event,date,bfr,grp,val,sms,num,bod) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", textField.text, textField1.text,textField2.text,textField3.text,textField4.text,isSelected,selectedVal,textField5.text,textView.text]; 
       textField5.text = reminderInstance.number; 
       textView.text = reminderInstance.msgBody; 
       const char *insert_stmt = [insertSQL UTF8String]; 
       sqlite3_prepare_v2(remindersDB, insert_stmt, -1, &statement, NULL); 
      } 

      if (sqlite3_step(statement) == SQLITE_DONE) 
      { 
       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"\nReminder Saved" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil,nil]; 
       [alert show]; 
       [alert dismissWithClickedButtonIndex:0 animated:YES]; 
       [alert release]; 
      } 

      else 
      { 
       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"Reminder not saved" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release]; 
      } 

     } 
    } 
} 

我带了表视图的另一个视图控制器,其中我填充了一个表视图来查看所有正在保存的记录,在选择时我们将他/她带到包含表单的控制器页面,即填充所有值到目前为止,我已经取得了成功在通过使用所有的值:按照表单控件的页面代码

1.:

-(id) initWithReminder:(ReminderClass *)aReminder 
{ 
    if ((self=[super init])) 
    { 
     self.reminderInstance = aReminder; 
    } 

    return self; 
} 

2.按显示控制器的部分代码:

-(void)loadReminders 
{ 

    // setup the reminders array 
    self.array = [[NSMutableArray alloc] init]; 

    //Retrieve the values of database 
    const char *dbpath = [self.databasePath UTF8String]; 
    sqlite3_stmt *statement; 
    if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM reminders"]; 

     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(self.remindersDB ,query_stmt , -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       ReminderClass *loadedReminder = [[ReminderClass alloc] init]; 

       loadedReminder.reminderID = sqlite3_column_int(statement, 0); 

       loadedReminder.Name = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]autorelease];      

       loadedReminder.Event = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]autorelease]; 

       loadedReminder.Date = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]autorelease]; 

       loadedReminder.numDays = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 4)]autorelease]; 

       loadedReminder.remGroup = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 5)]autorelease]; 

       loadedReminder.selString = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 6)]autorelease]; 

       loadedReminder.smsString = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 7)]autorelease]; 

       NSLog(@"selected value = %@",loadedReminder.smsString); 


       loadedReminder.number = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 8)]autorelease]; 

       loadedReminder.msgBody = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 9)]autorelease]; 


       NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease]; 
       [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
       NSDate *theDate = [dateFormat dateFromString:loadedReminder.Date]; 
       NSString *stringDate = [dateFormat stringFromDate:theDate]; 
       loadedReminder.Date = stringDate; 

       NSLog(@"Date = %@",loadedReminder.Date); 

       [self.array addObject:loadedReminder]; 
       [loadedReminder release]; 
      } 

      sqlite3_finalize(statement); 
     } 
     sqlite3_close(self.remindersDB); 
    } 

} 

现在发生了什么是因为我有显示控制器中的表视图,其中包含2个字段,除了链接到短信状态,并且其中一个字段填充了所有字段。当我选择视图控制器时,它将在行“loadedReminder上崩溃。数“:

*终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因是: '* - [NSPlaceholderString initWithUTF8String:]:NULL CSTRING'

当我删除loadedReminder.numberloadedReminder .msgBody,我们可以查看表(控制器页)没有崩溃的问题,什么那么...在表视图单元的选择我做了以下内容:

-(void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    ReminderClass *rem = [self.array objectAtIndex:indexPath.section]; 

    // Instantiate your detail/editor view controller, 
    // and pass in the ReminderClass object to be edited. 
    ERAddReminderViewController *rdvc = [[[ERAddReminderViewController alloc]initWithReminder:rem]autorelease]; 

    [self.navigationController pushViewController:rdvc animated:YES]; 
    rdvc.navigationItem.rightBarButtonItem.title = @"Edit"; 
} 

现在我可以看到在字段中正确填充的所有值,但交换机的问题除外。由于它正常保存,但交换机始终处于关闭状态,因此在填写表单和保存期间已将状态设置为默认状态它(如果用户选择它并填充最后2个字段)来保存它(记录)。

对不起,这个庞大的描述,只是想使其详细,让任何人都可以明白我的问题是什么,我已经做了几个searches。但无法完成任务。

任何人都可以请我建议如何在数据库中保存切换状态,然后从数据库sqlite加载记录时填充相同的方法。

感谢每一个预先:)

+0

有这么多的问题想到,我真的不知道从哪里开始!你知道数据库可以存储字符串以外的其他类型,不是吗? – 2012-03-06 12:39:50

+0

@NickBull是的,但我早些时候做了一个按钮,使它成为复选框,即。我已经设置普通按钮作为图像非选择和选择一个复选标记按钮图像,我已经将它保存为字符串格式只..以及更早的它曾经是表视图,所以我已经将值传递给值该提醒类保存在cellForRowAtIndexPath:方法!我也是成功的,同样我以为我可以用UISwitch实现同样的效果。如果我的决定是错误的,我真诚地后悔同样的 – 2012-03-06 12:45:36

+0

减少你的问题长度,否则没有人是gona take intrest在了解这个问题的忙碌工作中.. – 2012-03-06 12:53:52

回答

0

我发现了它的解决方案,使用NSString并分配字符串值,即添加到数组中的检索到的状态值。让我详细解释一下:

在Add Reminder页面中,带一个NSString让我们说currentState,现在回到保存的提醒是观看,采取名为“stateValues”的阵列和状态值添加到阵列,即:

loadedReminder.smsState = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 7)]autorelease]; 

[stateValues addObject:loadedReminder.smsState]; 

现在在做选择行的索引路径,我们正在导航添加提示页面进行编辑或修改现有提醒值,请这样做:

-(void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ReminderClass *rem = [self.array objectAtIndex:indexPath.section]; 
    NSLog(@" switch state in did : %@",[stateValues objectAtIndex:indexPath.section]); 
ERAddReminderViewController *rdvc = [[[ERAddReminderViewController alloc]initWithReminder:rem]autorelease]; 
    rdvc.currentState = [stateValues objectAtIndex:indexPath.section]; 
} 

我们已经成功地将这些值设置为当前状态,现在回到添加提醒页面来设置开关状态,在viewDidLoad方法做到以下几点:

-(void)viewDidLoad 
{ 

    if ([currentState isEqualToString:@"0"]) 
    { 
     [smsSwitch setOn:NO animated:NO]; 
    } 
    else if([currentState isEqualToString:@"1"]) 
    { 
     [smsSwitch setOn:YES animated:YES]; 
    } 
} 

就是这样,我们现在已保存的所有连续提醒值的正确的访问正确设置开关的状态。

希望它有帮助。谢谢!