从一个复制并转换为 Core Data 中的另一个属性

Posted

技术标签:

【中文标题】从一个复制并转换为 Core Data 中的另一个属性【英文标题】:Copy from one and convert to another Attribute in Core Data 【发布时间】:2015-01-24 19:58:25 【问题描述】:

在我的应用程序中,我使用了一个核心数据模型,其中只有一个实体和一些属性。我想要达到的目标:

属性“imagePath”是 NSString 类型,用于存储对应 .png 图像所在的文档目录的路径。

属性 B“imageCoreData”是二进制数据类型。

我想将文档目录中的所有图像移动到 Core Data。

所以我需要执行以下操作的代码 - 从文档目录中的属性 A 获取图像,将其转换为 NSData 并将其作为二进制数据保存到属性 B“imageCoreData”。并且对我得到的每个对象都这样做。

如果它成功完成,如果我能得到通知,那就太好了。也许它也应该在后台工作以不阻塞用户界面。

我想要的一样:

存储日期的 NSDate 类型的属性 C“日期”。

NSString 类型的属性 D“dateString”。

从属性 C 中获取日期并将日期从 NSDate 转换为 NSString 并将其保存在属性 D 中。对于我得到的所有对象,我也需要这个。

更新

我可以获得包含我所有到文档目录的路径的字典。但是如何拉出所有图像,隐藏并保存到属性B?

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
NSEntityDescription *entityImg = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];


fetchRequest.resultType = NSDictionaryResultType;


fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entityImg propertiesByName] objectForKey:@"imagePath"]];
fetchRequest.returnsDistinctResults = YES;


NSArray *dictionary = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

NSLog(@"%@", dictionary);

【问题讨论】:

不幸的是,没有什么真正有效的。从一种属性类型到另一种属性类型的转换并不难,但是我一次获得的所有对象都没有做到这一点。我想我需要以某种方式遍历所有对象,但由于我是初学者,我无法做到这一点。 查看 NSFetchRequest 以了解如何从核心数据存储中检索所有实体。检索到它们后,您可以遍历它们,更新属性,然后保存更新。 问题可能出在NSArray *dictionary。这条线有什么奇怪的地方吗? 【参考方案1】:

首先,将相同的信息存储两次是没有意义的。确定您想要的格式并存储它。

其次,不建议将大图像存储为Core Data中的二进制数据。您可以存储小图像,例如缩略图,否则这是个坏主意。

第三,在获取您的实体时,您不必考虑NSDictionaryResultType 的复杂性。只需使用默认值 (NSManagedObjectResultType) 并使用它。由于 Core Data 的 faulting 机制,您无需在内存或性能方面付出任何重大代价。

猜测您最初的问题是什么,您可能希望将数据发送到其他地方。在这种情况下,您应该进行必要的转换ad hoc

例如,要从您的实体创建日期字符串,请将 NSManagedObject 子类化(我将此类称为 Image)并添加一个方便的方法。 (请注意,日期格式只是一个示例。请参阅 NSDateFormatter 文档了解您的需要。)

-(NSString*)dateString 
    if (!self.date)  return @""; 
    static NSDateFormatter *formatter = nil;
    if (!formatter) 
         formatter = [[NSDateFormatter alloc] init];
         formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss"; 
    
    return [formatter stringFromDate:self.date];

至于图像,您不必进行任何转换,因为您的 png 文件的内容已经是 NSData 类型。只需从文件 URL 中读取它并使用 NSData 对象。

【讨论】:

感谢您的帮助。我的问题不是真正的转换。我不知道如何编写一个方法,从每个对象的 doc 目录中复制对应的图像并将其保存到核心数据中的二进制数据属性中。我不能遍历所有对象并为每个对象正确地执行此操作。一次性完成。 那我不明白这个问题。你仍然想做我所说的坏主意,好吧。获取所有对象,遍历它们,检索图像,将其存储在对象中,最后保存。有什么问题? 那个代码;)我不知道如何循环遍历每个对象一次 如果你不能编写一个 Objective-C 循环,那么你就无法使用 Core Data。先尝试一些教程。祝你好运! 谢谢,这真的很有帮助

以上是关于从一个复制并转换为 Core Data 中的另一个属性的主要内容,如果未能解决你的问题,请参考以下文章

转换后将数据从一列复制到同一表中的另一列

将 JSON 数据转换并存储为 iOS Core Data

如何将可绘制背景设置为仅将数字字符串转换为 android 中的另一个字符串?

如何从数据库中读取加密值并将其与 ASP.NET Core 中的另一个值进行比较?

如何在 Swift 中将可转换属性保存到 Core Data

将多个 .gz 文件从一个 GCS 存储桶复制到 Java 中的另一个存储桶