为啥这个 NSString 在 FireBase 查询块中为空?

Posted

技术标签:

【中文标题】为啥这个 NSString 在 FireBase 查询块中为空?【英文标题】:Why is this NSString null in a FireBase query block?为什么这个 NSString 在 FireBase 查询块中为空? 【发布时间】:2015-05-08 16:59:10 【问题描述】:

我不明白为什么这个字符串在 FQuery 块中为空。当我在用户键上构建 dailyLog MutableDictionary 时,我的应用程序不断崩溃;

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MMMM dd, YYYY"];

NSString *userID = [[self.userProfile objectForKey:@"userID"] copy];
self.logFirebase = [[Firebase alloc] initWithUrl:@"https://urlName.firebaseio.com/DailyLog"];
[[[self.logFirebase queryOrderedByPriority] queryEqualToValue:userID childKey:@"userID"] observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) 

    if (![snapshot.value isEqual:[NSNull null]]) 
        NSMutableArray *data = [CGCFirebaseDataExtractor extractKeysAndObjects:snapshot.value];

        self.dailyLog = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"Name CONTAINS[cd] %@",[df stringFromDate:[NSDate date]]]].lastObject;
    else
        self.dailyLog = [[NSMutableDictionary alloc] init];
        NSLog(@"users Profile:%@",self.userProfile);
        NSLog(@"users ID :%@",[self.userProfile objectForKey:@"userID"]);

        [self.dailyLog setObject:[df stringFromDate:[NSDate date]] forKey:@"date"];
        [self.dailyLog setObject:[self.userProfile objectForKey:@"userID"] forKey:@"user"];
        [self.dailyLog setObject:[NSNumber numberWithInt:450] forKey:@"calories"];


        [[self.logFirebase childByAutoId] setValue:self.userProfile];

    

];

编辑: 当我登录 self.userProfile 时,我得到了我想要的正确信息。但是当我从 FQuery 块中记录用户 ID 本身时,它是空的

这是我更新的崩溃数据:

2015-05-08 13:21:22.709 <appname>[4160:1321097] users Profile:
"-JoirTqCXFFDY1psLTNn" =     
    dateRegistered = "1431010405.81792";
    userID = "304D92EF-CE77-4A10-A55F-9847153699F7";
    userName = "User's Name";
;
 
 2015-05-08 13:21:22.709 <appname>[4160:1321097] users ID :(null)
 2015-05-08 13:21:22.714 <appname>[4160:1321097] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: user)'
  *** First throw call stack:
  (0x1852082d8 0x196a340e4 0x1850f1428 0x10007de00 0x1001454d0 0x100390fd4 0x100390f94 0x100395c28 0x1851bf7f8 0x1851bd8a0 0x1850e92d4 0x18e8ff6fc 0x189caefac 0x10007f14c 0x1970b2a08)
   libc++abi.dylib: terminating with uncaught exception of type NSException

【问题讨论】:

这与您最近删除的问题完全相同。 你的日志是假的。时间和线程不匹配。请重新运行应用并粘贴一次日志记录运行的实际结果 日志仍然是相同的输出 我明白,但重要的是要查看真实的日志记录 - 感谢您将其粘贴。 好吧,我终于想通了!我是个白痴。 【参考方案1】:

对不起,我是个白痴,没有仔细看你的日志。

2015-05-08 13:21:22.709 <appname>[4160:1321097] users Profile:
"-JoirTqCXFFDY1psLTNn" =     
    dateRegistered = "1431010405.81792";
    userID = "304D92EF-CE77-4A10-A55F-9847153699F7";
    userName = "User's Name";
;

这个对象显然是字典中的字典。第一个(外部)字典有键 "-JoirTqCXFFDY1psLTNn"这是它唯一的键。这就是为什么尝试获取密钥userID 失败的原因;该键是第二个(内部)字典的一部分。

【讨论】:

这不是导致崩溃的原因。我正在尝试将 userProfile 中的数据复制到 dailyLog 中。两个字典中的键是否匹配是无关紧要的。而且我也使用过 [self.userProfile objectForKey:@"userID"]。它仍然是空的 不,您没有尝试从 userProfile 复制数据。您正在尝试从第一行使用userID。但它是零。 换种说法,我试过使用 [self.userProfile objectForKey:@"userID"] 仍然得到 null 我真傻,我忘了通过我的 CGCFirebaseDataExtractor 运行那个字典。它修复了嵌套字典问题 我认为有某种方法。我对火力基地一无所知。

以上是关于为啥这个 NSString 在 FireBase 查询块中为空?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 Firebase“.indexOn”不起作用?

为啥这个 Firebase Function Promise 没有返回正确的错误?

转换对象以写入firebase? (只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象)

为啥在 Typescript(Firebase 函数)中双重导入 NPM 包

为啥来自 NSString 分配的 NSDecimalNumber 会失败?

为啥 firebase recyclerview 无法正常工作?