2012-03-19 2 views
2

В моем приложении у меня есть пользовательский NSObject, который содержит 2 изменяемых массива. Мне нужно сохранить этот пользовательский объект NSOB в основной объект данных, но у меня нет реальной идеи, как я могу это сделать ...Как сохранить (настраиваемый) NSObject в данных ядра

После некоторого поиска я узнал, что лучшим способом было бы преобразовать nsobject в nsdata и сохранить его в трансформируемом поле объекта ... но я не уверен, как это сделать. Может кто-нибудь мне помочь?

Heres в код для моего пользовательского объекта:

MeasureData.h

@interface MeasureData : NSObject{ 
} 

@property (nonatomic, strong) NSMutableArray *questionsData; 
@property (nonatomic, strong) NSMutableArray *answersData; 

- (id) init; 

@end 

MeasureData.m

#import "MeasureData.h" 

@implementation MeasureData 

@synthesize questionsData; 
@synthesize answersData; 

#pragma mark - 
#pragma mark int 

- (id)init 
{ 
self = [super init]; 

// Initalize questions array (width data from plist) 
questionsData = self.makeQuestionsArray; 
// NSLog(@"loaded questions array: %@",questionsData); // debug 


// Initalize answers array 
answersData = self.makeAnswersArray; 
// NSLog(@"loaded answers array: %@",answersData); // debug 


return self; 
} 

-(NSMutableArray *)makeQuestionsArray 
{ 
// Initalize questions array (width data from plist) 
NSString *path = [[NSBundle mainBundle] pathForResource: 
        @"questions.list" ofType:@"plist"]; 
NSMutableArray *questions = [NSMutableArray arrayWithContentsOfFile:path]; 


/* 
[questionsData insertObject:(NSString *)string atIndex:0]; 
*/ 

return questions; 
} 

-(NSMutableArray *)makeAnswersArray 
{ 
// Initalize answers array 
NSMutableArray *answers = [NSMutableArray arrayWithCapacity:0]; 

return answers; 
} 

-(id)initWithCoder:(NSCoder *)decoder { 
if ((self=[super init])) { 
    questionsData = [decoder decodeObjectForKey:@"questionsData"]; 
    answersData = [decoder decodeObjectForKey:@"answersData"]; 
} 
return self; 
} 

-(void)encodeWithCoder:(NSCoder *)encoder { 
[encoder encodeObject:questionsData forKey:@"questionsData"]; 
[encoder encodeObject:questionsData forKey:@"questionsData"]; 
} 

@end 

Согласно первому комментарию, я реализовал функции кодирования/кодер для мой пользовательский класс. И попытался архивировать и закодировать его (я новичок в ios, так что это может быть совершенно неправильно) - но это не работает ... может кто-нибудь сказать мне, что не так?

Heres кодирование (которое не работают XD):

NSMutableData *dataToSave = (NSMutableData *)self.measureData; 
NSKeyedArchiver *archiverForData = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataToSave]; 

[archiverForData encodeObject:dataToSave forKey:@"dataToSave"]; 
[archiverForData finishEncoding]; 
// 

//theMeasure is the CoreData Entity 
theMeasure.result = dataToSave; 
+0

что такое тип self.measureData? Вы должны создать новый, пустой объект NSMutableData, вместо того, чтобы отбрасывать ваш measureData ivar (я думаю, это будет тип MeasureData) и использовать encodeObject: self.measeureData на вашем исходном объекте. Также обратите внимание, что вы копируете в 2 раза одну и ту же строку в encodeWithCoder. – MrTJ

+0

спасибо;) Я знаю, использую несколько иной подход (возможно, это то же самое, я не уверен) => Я беру свой объект и использую «NSData * dataToSave = [NSKeyedArchiver archivedDataWithRootObject: measureData]; чтобы преобразовать его в NSData -> эти NSData могут быть сохранены в двоичном атрибуте и могут быть повторно преобразованы через NSKeyUnarchiver ... довольно легко, но мне потребовалось около 4 часов, пытаясь и пытающихся. – jacksbox

+0

да, таким образом я имел в виду изначально! Не жалейте на это 4 часа, я уверен, что вы много изучили;) PS: если вы так думаете, вы также можете «принять» мой ответ, нажав на белый тикер под +/- счетчиком. – MrTJ

ответ

2

В общих чертах:

  • создать NSMutableData
  • создать NSKeyedArchiver с initForWritingWithMutableData над вашими данными
  • сериализовать массивы/объекты/все, что вам нужно (что реализует NSCoding) с помощью методов encode ... NSCoder
  • создать управляемый объект с полем типа BLOB (двоичные данные)
  • записать закодированные данные из изменяемых данных в это поле управляемого объекта.

В моем ответе на этот вопрос вы можете найти некоторые полезные ссылки: NSCoding VS Core data

+0

hm, танк вас, это звучит хорошо - я также попробовал ваше предложение, но я не могу заставить его работать - я добавил свой пытается ответить на мой вопрос, так что, может быть, вы могли бы взглянуть и дать мне подсказку, что делать или что я делаю неправильно? – jacksbox

 Смежные вопросы

  • Нет связанных вопросов^_^