Iphone JSON和核心数据:我应该将JSON转换为核心数据吗?

Iphone JSON和核心数据:我应该将JSON转换为核心数据吗?,iphone,objective-c,ios,cocoa-touch,core-data,Iphone,Objective C,Ios,Cocoa Touch,Core Data,我是新的核心数据,我需要一些帮助我的项目 我正在开发一个iPhone应用程序,它可以从服务器上获取JSON(餐馆信息),在地图和表格视图上显示位置,并通过按“添加收藏夹”按钮存储喜爱的餐馆 现在,我只使用NSDictionary及其函数来显示表上的数据和注释,并使用favoriteRestaurant实体来存储喜爱的餐厅数据 但是,我希望将NSDictionary对象转换为核心数据对象(餐厅),并向其添加“BOOL isFavorite”属性,然后删除FavoriteStavorite实体。 生

我是新的核心数据,我需要一些帮助我的项目

我正在开发一个iPhone应用程序,它可以从服务器上获取JSON(餐馆信息),在地图和表格视图上显示位置,并通过按“添加收藏夹”按钮存储喜爱的餐馆

现在,我只使用NSDictionary及其函数来显示表上的数据和注释,并使用favoriteRestaurant实体来存储喜爱的餐厅数据

但是,我希望将NSDictionary对象转换为核心数据对象(餐厅),并向其添加“BOOL isFavorite”属性,然后删除FavoriteStavorite实体。 生成保存传递的餐厅对象并更改其“isFavorite”状态的函数,该状态由“add Favorite”按钮触发

favorite表仅显示已保存的餐厅,isFavorite=YES

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



嗨,谢谢你的快速回复。我忘了说我还想对该类实现MKAnnotation,这样地图上的每个注释pin都属于唯一的餐厅对象。如果我想这样做,我应该有另一个最喜欢的类或核心数据实体,还是将其保存在Restaurant表中并使isFavorite=YES?再次谢谢你

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


#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可能会给您带来内存问题。

我喜欢您的方法。在我看来,核心数据是前进的方向

如果将来有很多JSON记录(比如几十家或数百家餐馆)可能包含更多的数据字段,那么在使用
NSDictionary
s数组时可能会遇到内存问题。请记住,序列化的plist只能完全检索,因此如果它变大,则必须将所有数据保留在内存中

而且,你会非常希望从一开始就有更好的表现


您的
BOOL
属性(在核心数据中,它将是一个
NSNumber
)应该可以很好地满足您的需要。

它可以工作,但我不会为简单的情况使用核心数据,特别是如果您是新手的话。您可以将NSDictionary保存到磁盘,在不同的餐厅中添加一个键“isFavorite”,并对其进行更新。您可以将NSPredicates与NSDictionary一起使用,就像使用CoreDatas一样。谢谢您的回答。但我忘了说我想在每家餐厅实现MKAnnotation。我认为CoreData是唯一的方法。好的,谢谢你的回复。我尝试这种方法。成百上千的餐馆都不会成为用词的问题谢谢你回答我的问题。你认为这是一种更好的方法吗?即使我想在餐馆中使用核心数据?这种方法比使用核心数据更快,但核心数据更具可扩展性。