2012-07-30 131 views
0

我从SQLite数据库获取行并试图将它们插入到字典中。除了我不断收到错误!我得到的错误“Objective-C指针隐式转换为'const id *'不允许使用ARC”我知道这意味着当我添加对象到我的字典时不能使用指针。那么我该如何解决它,以便将这些数组添加到字典中?从数组添加对象到字典

NSArray *keyArray = [[NSMutableArray alloc] init ]; 
    NSArray *valueArray = [[NSMutableArray alloc ] init ]; 
    NSDictionary* dic; 
    NSInteger dataCount = sqlite3_data_count(statement); 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     @try { 
      for (int i = 0; i < dataCount; i ++) 
      { 
       NSString* key = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, i)]; 
       NSString *value = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, i)]; 

       if ([value length] == 0) 
       { 
        value = @""; 
       } 

       keyArray = [keyArray arrayByAddingObject:key]; 
       valueArray = [valueArray arrayByAddingObject:value]; 

      } 

     } 
     @catch (NSException *ex) 
     { 
      NSLog(@"%@,%@", [ex name], [ex reason]); 
     } 

     dic= [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray count:[keyArray count]]; 
+2

为什么不使用NSMutableArrays?你的错误究竟在哪里? – ohr 2012-07-30 18:00:05

+1

你在哪一行得到错误 – 2012-07-30 18:00:08

+0

'0'长度字符串已经是'@“”',并且不需要检查该值。如果你正在检查'NULL',那么你需要检查'sqlite3_column_text'的值,因为'stringWithUTF8String:'会在'NULL'值上崩溃。 – Joe 2012-07-30 18:06:31

回答

5

dictionaryWithObjects:forKeys:count:采用C语言风格的阵列,而不是NSArray对象。 dictionaryWithObjects:forKeys:可能会诀窍,但你可能会更好地构建一个可变的字典,因为你完全绕过NSArray s。

NSDictionary* dic; 
NSMutableDictionary *tmp = [NSMutableDictionary dictionary]; 

for (int i = 0; i < dataCount; i ++) 
{ 
    NSString* key = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, i)]; 
    NSString *value = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, i)]; 
    [tmp setObject:value forKey:key]; 
} 
dict = tmp; 
+2

'dictionaryWithObjects:<#(NSArray *)#> forKeys:<#(NSArray *)#>'带NSArrays,会有帮助吗? – ohr 2012-07-30 18:02:19

+0

@OscarHernandez非常感谢您提出这个问题,我更新了答案。谢谢! – dasblinkenlight 2012-07-30 18:04:40

+0

既然你的答案是正确的,可以挑选它!删除'[value length]'检查,因为它是不必要的。看到我上面的评论。 – Joe 2012-07-30 18:08:06

0

[dicBodyPost setValue:arrContactAddress forKey:@“contactAddress”];