将SQLite数据库的整数值转换为iPhone中的字符串值

时间:2012-01-06 06:17:21

标签: iphone objective-c

我有一个应用程序,其中有一个包含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无关。

4 个答案:

答案 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'中编码。确保回收单元格,确保重置已回收单元格的文本值。