使用 CoreData 存储 JSON 字符串

Posted

技术标签:

【中文标题】使用 CoreData 存储 JSON 字符串【英文标题】:Using CoreData to store JSON string 【发布时间】:2013-04-21 14:35:46 【问题描述】:

我有一组 JSON 字符串,其中每个 JSON 字符串都有一个键。现在,我想将这些 JSON 字符串存储在设备上,以便以后可以使用这些数据。 在这里,我不在设备上存储任何对象。 我可以使用 CoreData 还是有任何替代方法? 在设备上存储 JSON 的最佳做法是什么?

【问题讨论】:

如果数据确实与其他对象没有关系,可以尝试使用plist。你能展示你的 JSON 吗? 我的JSON会是这样的,"status":"success","userid":"129","description":"some description" 这样会有很多JSON字符串需要存储在设备上。 如果您要与用户和这些信息建立关系,最好使用 CoreData 或 Sqlite。否则,您可以这样存储 json 文件。我建议存储在 plist 中,因为与 json 相比,它更容易形成字典或数组,编辑它们然后再次保存,json 需要更多的努力来保存它们。是否还有其他信息需要存储。 感谢回复,如果我想在plist上存储100个或更多这样的JSON字符串,那能存储这么大的数据吗? 为什么要将数据存储为 JSON?为什么不解析一次数据并存储解析后的数据呢?这样会使用更少的存储空间,同时更容易使用。例如,使用已解析的数据,您可以轻松搜索 userid==129 的记录,但如果数据全部为 JSON,则必须先解析所有这些字符串才能进行此类搜索。 【参考方案1】:

您也可以简单地将 JSON 保存到文件中,并在下次需要时再次反序列化。

【讨论】:

【参考方案2】:

JSON 只是为服务器和客户端(您的应用程序)之间的快速传输定义了紧凑的数据格式。

您需要做的是将服务器上的 JSON 数据解码为数据类型 NSDictionary、NSArray、NSString...,然后如果要存储它们,请使用 plist、sqlite 或 CoreData 进行存储。

对于CoreData,您需要创建与JSON格式关联的实体。

例如:"key":"value" -> NSDictionary

【讨论】:

因为我只存储一组 JSON 字符串,在 CoreData、sqlite、file 和 plist 中,哪个更适合使用?【参考方案3】:

如果您没有太多数据要存储,您可以使用 plist 或 json。 Plist 会更容易,如果你这样存储 json,你需要多几行代码。

创建一个 DataHelper 类,其中包含 save、add、findAll、findFirtWithValue:forObject: 方法。

这是一个示例

#define kPlistFilePath @"Data.plist"
#define kJsonFilePath @"Data.json"

@implementation DataController

+ (NSString *)savedFilePath

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = paths[0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:kPlistFilePath];
    return filePath;


+ (NSArray *)findAll
   
    NSString *filePath = [self savedFilePath];
    return [NSArray arrayWithContentsOfFile:filePath];


+ (void)saveJSON:(id)object 

    NSString *filePath = [self savedFilePath];

    NSArray *unsavedArray = nil;

    if ([object isKindOfClass:[NSString class]]) 
        NSError *error = nil;
        unsavedArray = [NSJSONSerialization JSONObjectWithData:[object dataUsingEncoding:NSUTF8StringEncoding]
                                                       options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments
                                                         error:&error];

    else if([object isKindOfClass:[NSArray class]])
        unsavedArray = object;

    else if([object isKindOfClass:[NSDictionary class]])
        unsavedArray = @[object];
    

    if ([unsavedArray count]) 
        [unsavedArray writeToFile:filePath atomically:NO];
    




+ (NSDictionary *)userInfoForID:(NSString *)userID

    NSArray *allData = [self findAll];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userid = %@",userID];
    return [[allData filteredArrayUsingPredicate:predicate]lastObject];

【讨论】:

以上是关于使用 CoreData 存储 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 CoreData 信息 POST JSON 到服务器

NSFetchedResultsController、CoreData、SectionIndex 和特殊字符 (Umlaute..)

字符串的最后一部分未插入 coredata

使用 coredata 存储/缓存非标准数据类型

从 JSON 初始化链接 CoreData 实体

将字符串与 CoreData 进行比较