【问题标题】:JSON and Core Data:Should I convert JSON into Core Data?JSON 和核心数据:我应该将 JSON 转换为核心数据吗?
【发布时间】:2011-10-20 08:57:34
【问题描述】:

我是 Core Data 的新手,我的项目需要一些帮助。

我正在开发 iPhone 应用程序,该应用程序从服务器获取 JSON(餐厅信息)并在地图和表格视图上显示位置,并通过按“添加收藏”按钮存储最喜欢的餐厅。

目前,我只是使用 NSDictionary 及其函数在表格和注释上显示数据,并使用 favoriteRestaurant 实体来存储最喜欢的餐厅数据。

但是,我想将 NSDictionary 对象转换为 Core Data 对象(餐厅),并为其添加“BOOL isFavorite”属性,然后删除 favoriteRestaurant 实体。 制作保存传递的餐厅对象并更改其“isFavorite”状态的函数,该状态由“添加收藏夹”按钮触发。

最喜欢的表只显示已保存的餐厅,isFavorite = YES。

我想知道这是否是实现我想要的正确方法。 提前谢谢!


您好,感谢您的快速回复。我忘了说我还想为那个类实现 MKAnnotation,所以地图上的每个注释图钉都属于唯一的餐厅对象。如果我想这样做,我应该有另一个最喜欢的类或核心数据实体,还是将它保存在 Restaurant 表中并设置 isFavorite = YES?再次感谢您!

【问题讨论】:

  • 它会起作用,但我不会在简单的情况下使用 Core Data,特别是如果你是新手。您可以将您的 NSDictionaries 保存到磁盘,并在您的不同餐厅中添加一个键“isFavorite”,然后更新它。您可以将 NSPredicates 与 NSDictionaries 一起使用,就像使用 CoreData 一样
  • 感谢您的回答。但是我忘了说我要对每家餐厅实施 MKAnnotation。我认为 CoreData 只是这样做的方法。

标签: iphone objective-c ios cocoa-touch core-data


【解决方案1】:

如果您只关心保存收藏夹,那么请使用 plist 序列化。我在多个应用程序中做同样的事情。通常我会创建一个如下所示的 Helper 类。

#import "Favorites.h" #import "NSArray+Locations.h" @implementation Favorites +(void)addFavorite:(Location *)location{ NSMutableArray *remove = [NSMutableArray array]; [location.data enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@,%@, %@",key,obj,[obj class]); if([obj isKindOfClass:[NSNull class]]) [remove addObject:key]; }]; [location.data removeObjectsForKeys:remove]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * favorites = [NSMutableDictionary dictionaryWithDictionary:[defaults objectForKey:FAVORITES]]; if(!favorites) favorites = [NSMutableDictionary dictionaryWithCapacity:1]; [favorites setObject:location.data forKey:[location getID]]; [defaults setObject:favorites forKey:FAVORITES]; [defaults synchronize]; } +(void)removeFavorite:(Location *)location{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * favorites = [NSMutableDictionary dictionaryWithDictionary:[defaults objectForKey:FAVORITES]]; [favorites removeObjectForKey:[location getID]]; [defaults setObject:favorites forKey:FAVORITES]; [defaults synchronize]; } +(NSArray *)getFavorites{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * favorites = [defaults objectForKey:FAVORITES]; return [NSArray arrayWithLocations:[favorites allValues]]; } +(BOOL)isFavorited:(Location *)location{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSMutableDictionary * favorites = [defaults objectForKey:FAVORITES]; for(NSString *key in [favorites allKeys]) if([[location getID] isEqualToString:key]) return YES; return NO; } @end

在这种情况下,Location 对象只是一个字典的包装器,以使访问字段更简单。

如果您想保存所有数据而不仅仅是收藏夹,那么我会使用核心数据,否则一个非常大的 plist 可能会给您带来内存问题。

【讨论】:

  • 感谢您回答我的问题。即使我想将 Core Data 用于餐厅,您认为这是更好的方式吗?
  • 这种方式比使用核心数据 imo 更快,但核心数据更具可扩展性。
【解决方案2】:

我喜欢你的方法。在我看来,Core Data 是要走的路。

如果您获得大量 JSON 记录(例如,数十家或数百家餐厅),并且将来可能包含更多数据字段,则在使用 NSDictionarys 数组时可能会遇到内存问题。请记住,序列化的 plist 只能完全检索,因此如果它变大,您必须将所有数据保存在内存中。

此外,您会非常希望从一开始就有更好的表现。

您的BOOL 属性(在Core Data 中是NSNumber)应该可以满足您的目的。

【讨论】:

  • 好的,谢谢您的回复。我尝试这种方法。
  • 数百家餐厅不会成为字典的问题
猜你喜欢
  • 2010-11-04
  • 2014-01-14
  • 2012-08-24
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多