我有一个应用程序,其中有一个包含7行的tableview,其值从星期日到星期六。如果我选择星期日并保存,则在我的数据库中输入1。如果我选择“星期日”和“星期一”,则输入该特定ID的1和2。这工作正常。
现在我试图通过比较在SQLite数据库中输入的整数值来在我的textlabel中显示字符串值;即对于特定的id,如果在数据库中输入1,那么在textlabel中应显示“Sunday”,如果在数据库中输入1和2,则在textlabel中,应显示“Sunday”和“Monday”。 / p>
我已经为此完成了代码,但问题是当我选择“星期日”和“星期一”时,只有“星期一”才会显示在文本标签中而不是两者中。另一个问题是值会在所有单元格中显示。
这是我的代码,我根据id
从数据库中获取值-(void)selectDaysFromDatabase
{
appDelegate = (StopSnoozeAppDelegate*)[[UIApplication sharedApplication]delegate];
NSString *filePath = [self getWritableDBPath];
sqlite3 *database;
for (int i = 0; i<[appDelegate.alarmdaysarray count]; i++)
{
if (sqlite3_open([filePath UTF8String], &database) ==SQLITE_OK)
{
NSString *query =[NSString stringWithFormat:@"select alarm_days from AlarmDays where alarm_id =%@",[appDelegate.alarmdaysarray objectAtIndex:i]];
const char *sql = [query cStringUsingEncoding:NSUTF8StringEncoding];
sqlite3_stmt *selectstmt;
if (sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) ==SQLITE_OK)
{
while ( sqlite3_step(selectstmt) ==SQLITE_ROW)
{
WEEKDAY_INTVALUE =[NSNumber numberWithInt:(int)sqlite3_column_int(selectstmt, 0) ];
[daydisplayarray addObject:WEEKDAY_INTVALUE];
for(int i = 0;i<[daydisplayarray count];i++)
{
str_label =@"";
int val = [[daydisplayarray objectAtIndex:i]intValue];
if (val==0) {
NSString *str = @"SUN";
str_label = [str stringByAppendingString:@"SUN"];
}
if (val==1){
str_label =[str_label stringByAppendingString:@"MON"];
}
if(val==2){
str_label =[str_label stringByAppendingString:@"TUE"];
}
if(val==3)
{
str_label =[str_label stringByAppendingString:@"WED"];
}
if(val==4)
{
str_label =[str_label stringByAppendingString:@"THU"];
}
if(val==5) {
str_label =[str_label stringByAppendingString:@"FRI"];
}
if(val==6)
{
str_label =[str_label stringByAppendingString:@"SAT"];
}
}
}
}
else {
sqlite3_close(database);
}
}
}
}
在cellForRowAtIndexPath中的我已经将此代码显示在我的单元格中
cell.mRepeatLbl.text = [NSString stringWithFormat:@"%@",str_label];
//这里我直接将我的str_label设置为我的单元格。所以问题是在单元格上设置的值与id无关。
答案 0 :(得分:0)
每次调用setString或setText时,它都会替换ui元素中的文本。如果您需要附加字符串,例如星期一,您需要执行类似
的操作[uxTextField setString:[[uxTextField stringValue] stringByAppendingString:@" Monday"];
对于在多个单元格中更新的值,您能否确认您的变量和出口是否具有一对一的映射?
答案 1 :(得分:0)
str_label =@"";
应该不在循环中......因为它会再次将其重新初始化为@""
..
答案 2 :(得分:0)
str_label =@"";
必须高于循环..
你能帮我理解ForLoop里面的目的吗?
因为你已经在while循环中,所以你可以在没有for循环的情况下做同样的事情。
因此你的while循环必须如下
str_label =@"";
while ( sqlite3_step(selectstmt) ==SQLITE_ROW)
{
WEEKDAY_INTVALUE =[NSNumber numberWithInt:(int)sqlite3_column_int(selectstmt, 0) ];
[daydisplayarray addObject:WEEKDAY_INTVALUE];
int val = WEEKDAY_INTVALUE;
if (val==0) {
NSString *str = @"SUN";
str_label = [str_label stringByAppendingString:@"SUN"];
}
if (val==1){
str_label =[str_label stringByAppendingString:@"MON"];
}
if(val==2){
str_label =[str_label stringByAppendingString:@"TUE"];
}
if(val==3)
{
str_label =[str_label stringByAppendingString:@"WED"];
}
if(val==4)
{
str_label =[str_label stringByAppendingString:@"THU"];
}
if(val==5) {
str_label =[str_label stringByAppendingString:@"FRI"];
}
if(val==6)
{
str_label =[str_label stringByAppendingString:@"SAT"];
}
}
答案 3 :(得分:0)
一些建议:
摆脱if(value == x)spagetti代码。对工作日名称使用填充了NSString值的静态NSArray,并使用index来获取正确的日期字符串。非编译示例代码:
- (NSString *)weekName:(NSUInteger *)index
{
static NSArray *nameArray = nil;
if (!nameArray) {
nameArray = [[NSArray alloc] initWithObjects:
@"empty on purpose since you use 1 for Sunday",
@"Sunday", @"Monday", @"Tuesday", @"Wednesday",
@"Thursday", @"Friday", @"Saturday",
nil];
}
return [nameArray objectAtIndex:index];
}
就像每个人都说的那样,代码'str_label = @“”;'似乎在每个for循环中将字符串重置为@“”(空)。没有必要将任何内容附加到空字符串。代码看起来很奇怪,有太多未定义的(全局)变量,但猜这样的事情可能会这样:
NSMutableArray *a = [NSMutableArray arrayWithCapacity:7];
for (int i=0; i<[daydisplayarray count]; i++)
{
NSInteger index = [[daydisplayarray objectAtIndex:i] intValue];
[a addObject:[self weekName:index]];
}
str_label = [a componentsJoinedByString:@", "];
if (!str_label) str_label = @"Nothing found!";
Btw值显示在每个单元格中,因为您在'cellForRowAtIndexPath'中编码。确保回收单元格,确保重置已回收单元格的文本值。