iPhone - закодируйте массив данных из объекта CoreData и сохраните в строке Base64 - PullRequest
0 голосов
/ 20 февраля 2010

У меня есть модель данных с тремя объектами (Покупка, Предметы, Изображение), покупка является основной с двумя другими в качестве связанных атрибутов.

Мне нужно иметь возможность отправлять данные на веб-сервер, и я должен кодировать в 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 голосов
/ 20 февраля 2010

Компоновщик дает вам предупреждение, что "NSData может не отвечать на dataWithBase64EncodedString"?

Если это так, проблема заключается в том, что ваши категории не импортированы должным образом, и метод не существует в отношении этого сегмента кода. Убедитесь, что вы импортируете категории в заголовок или реализацию для любого класса, к которому относится приведенный выше код.

Edit01

Я только что заметил, что вы загружаете массив NSManagedObjects. Я не думаю, что NSData может конвертировать непроверенные управляемые объекты. Вы должны уволить неисправность на всех свойствах, включая отношения.

Попробуйте установить выборку, которую вы используете, чтобы заставить объекты возвращать возвращаемые ошибочные объекты.

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

Когда вы распечатываете отказавший NSManagedObject, отношение не выглядит как:

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

Вместо этого он сбрасывает объект / ы на другом конце отношений. Если ваш график очень сложный, вы можете получить очень обширный дамп.

Базовые графы данных могут быть очень сложными и трудными для сериализации / архивирования. Действительно, базовые данные существуют для обработки графиков, которые не могут быть легко представлены массивами и словарями.

Чтобы сделать график достаточно простым для загрузки, вам может потребоваться создать объекты массива или словаря и заполнить их значениями управляемых объектов. Затем преобразуйте это в данные.

...