我有一个窗体包含文本字段,一个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.number和loadedReminder .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加载记录时填充相同的方法。
感谢每一个预先:)
有这么多的问题想到,我真的不知道从哪里开始!你知道数据库可以存储字符串以外的其他类型,不是吗? – 2012-03-06 12:39:50
@NickBull是的,但我早些时候做了一个按钮,使它成为复选框,即。我已经设置普通按钮作为图像非选择和选择一个复选标记按钮图像,我已经将它保存为字符串格式只..以及更早的它曾经是表视图,所以我已经将值传递给值该提醒类保存在cellForRowAtIndexPath:方法!我也是成功的,同样我以为我可以用UISwitch实现同样的效果。如果我的决定是错误的,我真诚地后悔同样的 – 2012-03-06 12:45:36
减少你的问题长度,否则没有人是gona take intrest在了解这个问题的忙碌工作中.. – 2012-03-06 12:53:52