Проблема сохранения контекста базовых данных управляемого объекта - PullRequest
1 голос
/ 01 сентября 2011

Я пытаюсь сохранить массив в базовые данные, используя NSData, но мой ManagedObjectContext говорит, что есть 0 объектов, и когда я его вызываю, он отображается как NULL. У меня есть сущность с именем Event и 3 атрибута (chatArray, ..., ...). Я пытался в течение 11 часов и не могу понять это. Я полагаю, что я устанавливаю это неправильно, потому что NSData является правильным. Как я должен установить это ???

UPDATE

Я разрабатываю приложение чата, и у меня есть сообщения чата в виде таблицы (это массив данных). Мне нужно сохранить всю историю чата, когда вы выходите из приложения и перезагружаете его. У меня есть сообщения, поступающие в виде строк и добавить его в массив для таблицы. Если я не сделал массив и добавил сообщения в виде строк текста к основным данным, как бы я добавил их в массив для табличного представления при перезагрузке приложения?

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSManagedObject *managedObject;

//

NSArray *array = [[[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil]autorelease];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
NSLog(@"data %@",data);

NSLog(@"Array %@",[NSKeyedUnarchiver unarchiveObjectWithData:data]);

[(Event*)managedObject setValue:data forKey:@"chatArray"];

if ([self managedObject])
{
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]];
    [(Event *)managedObject setChatArray:data];              }
else {
    Event *event = [[[Event alloc] initInsertingIntoManagedObjectContext:managedObjectContext]autorelease];
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]];
    [event setChatArray:data];
}

NSError *error;
[managedObjectContext save:&error];

NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:[(Event*)managedObject valueForKey:@"chatArray"]];

NSLog(@"chatArray %@",myArray);

1 Ответ

1 голос
/ 02 сентября 2011

Брэндон,

Во-первых, в базовых данных большие двоичные объекты должны храниться в конечных узлах (т. Е. Объект, который просто содержит большой двоичный объект и отношение обратно к одному. (Этот шаблон / соглашение возник, потому что онпочти тривиально получить цикл хранения больших двоичных объектов, когда в сущности есть другие отношения.)

Во-вторых, почему вы храните эти строки как массив, а не как сущность с отметкой времени и т. д.?BLOB не особенно эффективен, чем отдельные строки, плюс система может как искать сообщения, так и более гибко хранить строки. SQLite обрабатывает строки специально.

В-третьих, кажется, что вы составляете свой класс, а не наследуете отваша модель, почему? Это делает ваш код более сложным.

Наконец, действительно трудно сказать, что вы пытаетесь сделать. Не могли бы вы включить ваш полный файл .h? И полное объявление метода?

Андрей

...