【发布时间】:2012-03-08 10:04:13
【问题描述】:
我是这个开发的新手。
我想将一个类的完整对象存储到我的数据库中。 实际上,我正在创建应用程序,用户可以在其中向父视图添加多个视图并希望保存它,以便下次用户获取它时,他将获得他保存的内容,即先前对父视图的视图。
任何关于相同的逻辑或建议都会很有帮助,
提前致谢
【问题讨论】:
标签: iphone ios database class object
我是这个开发的新手。
我想将一个类的完整对象存储到我的数据库中。 实际上,我正在创建应用程序,用户可以在其中向父视图添加多个视图并希望保存它,以便下次用户获取它时,他将获得他保存的内容,即先前对父视图的视图。
任何关于相同的逻辑或建议都会很有帮助,
提前致谢
【问题讨论】:
标签: iphone ios database class object
您要保存的任何对象都需要符合 NSCoder 协议。请记住,如果您的父对象中有自定义对象,它们将需要符合 NSCoder。将以下方法添加到您的自定义类中。
- (id)initWithCoder:(NSCoder *)coder {
_inventory = [[coder decodeObjectForKey:@"inventory"] retain];
return self;
}
- (void)encodeWithCoder:(NSCoder *) encoder{
[encoder encodeObject:_inventory forKey:@"inventory"];
}
在上面的示例中,我想对玩家的库存进行编码。如果清单包含自定义对象(例如,与一堆 NSString 相对),它们还需要自己的 NSCoder 方法。
下面我把它变成你可以保存到 NSUserDefaults 的东西。适当调整以存储在数据库中。请记住,如果您想通过网络发送 NSData 以存储在数据库中,您需要将其转换为 Base64 并可能对其进行压缩。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData * encodedObject = [NSKeyedArchiver archivedDataWithRootObject:rootObject];
[defaults setObject:encodedObject forKey:kSaveArchiveKey];
[defaults synchronize];
另一方面,您需要获取您的 NSData,对它执行我上面描述的任何魔法(base64、压缩)并取消归档。
PlayerInventory *inventory = [NSKeyedUnarchiver unarchiveObjectWithData:playerInventoryData]
【讨论】:
您应该根据您的具体需求在 NSCoding 和 Core Data 之间进行选择。有关更多信息,请参阅此帖子:NSCoding VS Core data
【讨论】:
您可以在数据库中存储任何对象的状态(任何属性的值)。你应该使用 NSCoding.Example here
【讨论】: