iPhone - 从核心数据实体编码数据数组并存储在Base64字符串中

时间:2010-02-20 15:53:53

标签: iphone base64 nsdata encode decode

我有一个包含三个实体(购买,物品,图像)的数据模型,购买是主要的,其他两个作为相关属性。

我需要能够将数据发送到Web服务器,并且我必须在base64中编码,我有几个类来处理从网上下载的编码和解码,它们是用于NSData类,但是当我使用它们时,我收到一个空字符串。

     // For Error Information
 NSError *error;

 // Create a File Manager
 NSFileManager *fileManager = [NSFileManager defaultManager];

 // Point to the Documents Directory
 NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

 // File we want to create in the Documents Directory
 NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"dataArray.txt"];

 NSString *joined = [self.dataList componentsJoinedByString:@","];

 NSData *myData = [NSData dataWithBase64EncodedString:joined];
 NSLog(@"%@", myData); // THIS IS NULL
 [myData writeToFile:filePath atomically:YES];

所以阵列吐出来......

   <Purchase: 0x502b7a0> (entity: Purchase; id: 0x502a620 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Purchase/p22> ; data: {
    amount = 123.56;
    image = 0x502c7b0 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Image/p11>;
    items = "<relationship fault: 0x5024900 'items'>";
    latitude = 37.331689;
    longitude = -122.030731;
    name = "Macy's";
    thumbnailImage = "(...not nil..)";
    timestamp = 2010-02-18 18:03:03 -0500;
    type = nil;
}),<Purchase: 0x502bdf0> (entity: Purchase; id: 0x502a630 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Purchase/p20> ; data: {
    amount = 12.34;
    image = 0x502c8e0 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Image/p9>;
    items = "<relationship fault: 0x502ef40 'items'>";
    latitude = 37.331689;
    longitude = -122.030731;
    name = Rippers;
    thumbnailImage = "(...not nil..)";
    timestamp = 2010-02-18 12:18:34 -0500;
    type = Travel;
}),<Purchase: 0x502c0e0> (entity: Purchase; id: 0x502a640 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Purchase/p21> ; data: {
    amount = 5.56;
    image = 0x502ca40 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Image/p10>;
    items = "<relationship fault: 0x502f6a0 'items'>";
    latitude = 37.331689;
    longitude = -122.030731;
    name = "Roy Rogers";
    thumbnailImage = "(...not nil..)";
    timestamp = 2010-02-18 17:45:03 -0500;
    type = Clothing;
}),<Purchase: 0x502c320> (entity: Purchase; id: 0x502a650 <x-coredata://92618241-3890-45FD-B1D7-7F17D52CAF38/Purchase/p16> ; data: {
    amount = 5.52;
    image = nil;
    items = "<relationship fault: 0x502f9e0 'items'>";
    latitude = 37.331689;
    longitude = -122.030731;
    name = heariam;
    thumbnailImage = nil;
    timestamp = 2010-02-18 09:41:35 -0500;
    type = nil;
})

如何将其编码为base64字符串,以便将其通过电子邮件发送到网络服务器

任何帮助都非常感谢,甚至是正确的方向,我仍然是编程的新手。

1 个答案:

答案 0 :(得分:0)

链接器是否发出警告,“NSData可能无法响应dataWithBase64EncodedString”?

如果是这样,问题是您的类别未正确导入,并且就此代码段而言,该方法不存在。确保将类别导入到上面代码所属的任何类的标题或实现中。

Edit01

我刚注意到你加载了一个NSManagedObjects数组。我不认为NSData可以转换未受管理的托管对象。你必须解决所有属性,包括关系。

尝试设置用于获取要返回的对象的提取,返回出现故障的对象。

[dataListFetch setReturnsObjectsAsFaults:NO]; // or yes, I always get the two reversed.

当您打印出有故障的NSManagedObject时,关系看起来不像:

items = "<relationship fault: 0x5024900 'items'>";

相反,它会将对象转储到关系的另一端。如果您的图表非常复杂,您可以获得非常广泛的转储。

核心数据图表可能非常复杂,难以序列化/存档。实际上,核心数据的存在是为了处理数组和字典无法轻易表示的图形。

要使图表足够简单以便上载,您可能必须创建数组或字典对象,并使用托管对象的值填充它们。然后将其转换为数据。