使用 plist 将数据插入核心数据时卡住

Posted

技术标签:

【中文标题】使用 plist 将数据插入核心数据时卡住【英文标题】:stuck while inserting the data into core data using plist 【发布时间】:2012-12-06 07:59:51 【问题描述】:

我在核心数据中有一个名为“类别”的实体,它有 3 个属性。

    parent_id category_id 类别名称

现在在根字典下的 CategoriesFile.plist 中,我创建了 3 个名为

的数组
    parent_id category_id 类别名称

我已经在这些数组中填充了适当的数据。

现在我已经编写了以下代码来插入数据

   NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsPath = [paths objectAtIndex:0];
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"CategoriesFile.plist"];
        if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
        
            // if not in documents, get property list from main bundle
            plistPath = [[NSBundle mainBundle] pathForResource:@"CategoriesFile" ofType:@"plist"];
        

        // read property list into memory as an NSData object
        NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
        NSString *errorDesc = nil;
        NSPropertyListFormat format;

        // convert static property list into dictionary object
        NSDictionary *thisGardenDictionary = [[NSDictionary alloc] init];
        NSDictionary *plistDictionary = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
        if (!plistDictionary)
        
            NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
        

        [plistDictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, id object, BOOL *stop) 
            NSManagedObject *manObj = [NSEntityDescription insertNewObjectForEntityForName:@"Categories" inManagedObjectContext:context];

            [manObj setValue:[thisGardenDictionary objectForKey:@"category_id"]  forKey:@"category_id"];
        [manObj setValue:[thisGardenDictionary objectForKey:@"parent_id"] forKey:@"parent_id"];
        [manObj setValue:[thisGardenDictionary objectForKey:@"category_name"] forKey:@"category_name"];


             ];
 NSError *error;
    if(![context save:&error])
    
        NSLog(@"Whoops, couldn't save %@",[error localizedDescription]);
    

但我得到空白结果。

有人可以说我缺少什么吗?

【问题讨论】:

没有什么是明显错误的——是时候使用调试器来运行它,以验证 plistDictionarycontextmanObj 是否都符合您的预期。跨度> 【参考方案1】:

设置NSManagedObject 的属性 例如

[manObj setName:@"Name"];

等等。 然后保存上下文以将值存储在 CoreData 数据库中。

if (![context save:&error]) 
   NSLog(@"Unresolved error : %@", [error userInfo]);

【讨论】:

你在哪里保存上下文?【参考方案2】:

应该这样做(我相信您已验证 plist 已正确读取):

NSDictionary *allArrays = [NSDictionary dictionaryWithContentsOfFile:plistPath];
for (int i = 0; i < [[allArrays objectForKey:@"parent_id"] count]; i++) 
   NSManagedObject *object = [NSEntityDescription 
    insertNewObjectForEntityForName:@"Categories" 
             inManagedObjectContext:context];
    for (NSString *s in @[@"parent_id", @"category_id", @"category_name"]) 
      [object setValue:[[allArrays objectForKey:s] objectAtIndex:i] forKey:s];
    

// save

但是,我要说的是,这是一种组织数据的非常尴尬的方式。更好的是一系列字典。在您的设置中,如果所有数组的元素数量不同,结果将是灾难性的。

【讨论】:

以上是关于使用 plist 将数据插入核心数据时卡住的主要内容,如果未能解决你的问题,请参考以下文章

监控卡住的python进程

hbase批量查询卡住

快速插入和拔出USB时,GetVolumeInformationW卡住了

引导表卡住“正在加载,请稍候”

使用 pyspark 将数据从 kafka 写入 hive - 卡住

CKEditor 文件管理器在上传文件时卡住了?