将对象保存到 Firebase
Posted
技术标签:
【中文标题】将对象保存到 Firebase【英文标题】:Saving Objects to Firebase 【发布时间】:2015-09-02 10:22:52 【问题描述】:第一次使用 Firebase 应用。我了解它不允许您保存实际的 Objective C 对象。我了解所有内容都保存在 JSON 树中,可以是 NSStrings、NSNumbers、NSArrays、NSDictionaries。实际上,您必须深入到每个属性才能获得实际值。前任。
假设你有 myObject => Firebase 不喜欢它。您必须通过获取属性来设置值。前任。 myObject.name (这将是一个字符串)。如果你的对象有很多属性,这很烦人。
我知道您可以实现 NSCoding 以使其更加优雅。我以前从来没有这样做过。我有一个用户的以下对象。
#import <Foundation/Foundation.h>
@interface User : NSObject <NSCoding>
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *currentCity;
@end
#import "User.h"
@implementation User
@dynamic username;
@dynamic name;
@dynamic currentCity;
-(void)encodeWithCoder:(NSCoder *)encoder
[encoder encodeObject:self.username forKey:@"username"];
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeObject:self.currentCity forKey:@"currentCity"];
-(id)initWithCoder:(NSCoder *)decoder
if (self = [super init])
self.username = [decoder decodeObjectForKey:@"username"];
self.name = [decoder decodeObjectForKey:@"name"];
self.currentCity = [decoder decodeObjectForKey:@"currentCity"];
return self;
所以当保存到存储在 Firebase 中的用户对象时,我们是否只是在保存到 Firebase 时对对象进行编码?
我对如何保存甚至检索它有点困惑。 Parse 更直接,但对于这个应用程序,我需要用户 firebase。
对于你们如何处理此问题的任何帮助或示例将不胜感激。
谢谢!
【问题讨论】:
【参考方案1】:这并没有直接回答问题,而是提供了一个简单的选项。
将 firebase 节点视为具有名称和一组键/值属性。类似于 ObjC 中的 Object。
为了让它变得超级简单,只需为您的 ObjC 对象提供一些智能以处理从 Firebase 读取的字典,并在 ObjC 对象更改时更新 Firebase 子节点。
例如;作为 FDataSnapshot 读入单个 firebase 节点(带有子“属性”)。 (假设我们只读取一个节点而不是它们的数量)。快照有一个 .value 属性,它是一个键/值对的字典。下面是它在 Firebase 中的外观:
user_id_0
userName: "dude"
name: "Joe Smith"
currentCity: "Miami"
您的用户对象将是一个具有三个相同属性的对象;用户名、名称和当前城市。 (重要的是要匹配此示例中的名称)
当您初始化 User 对象时,只需将 FDataSnapshot (ss) 中的字典传递给它,它就会从这些键中填充自己。像这样的
NSDictionary *dict = ss.value;
User *aUser = [User new];
[aUser initWithDict:dict];
以及在 User 对象的 initWithDict 方法中
for ( id key in dict )
id value = dict[key];
[self setValue:value forKey:key];
上面遍历了 Firebase 字典中的每个键/值对,然后在用户对象中填充匹配的属性。这也使得 User 对象非常灵活;就像当您向 firebase 中的节点(如 favoriteFood)添加新的子值(属性)时一样,它可以简单地作为同名属性添加到 User 对象中。
如果您不想将名称绑定在一起,只需使用 Firebase 名称上的一些 if..then 即可填充 User 对象。
同样,在更新 User 对象的属性时,使用 User 对象中的一个方法来更新 firebase 中的子节点。提示:您还应该将 Firebase 节点名称存储在 User 对象中,以便它知道要更新哪个节点。
还有 100 种其他方法可以使用此功能,但此选项确实简化了将数据移入和移出 Firebase 的过程。
【讨论】:
您好,Jay 感谢您的回复。所以基本上你所有的对象都应该指向 Firebase 上的特定节点?我能够登录并使用来自 firebase 的数据填充我的对象 - 它不像解析那么直观。 是的!每个对象(例如 User 对象)都会知道它在 Firebase 中的节点。随着对象的更新,它会自动知道更新它在 Firebase 中的相应节点。我建议不要直接比较 Parse 和 Firebase;它们是不同的平台,您存储数据(以及处理数据的方式)的方式也不同。以上是关于将对象保存到 Firebase的主要内容,如果未能解决你的问题,请参考以下文章