核心数据管理对象上下文保存问题

时间:2011-09-01 16:42:20

标签: iphone objective-c ios core-data saving-data

我正在尝试使用NSData将数组保存到核心数据中,但是我的ManagedObjectContext说有0个对象,当我调用它时,我将它显示为NULL。我有一个名为Event的实体和3个属性(chatArray,...,...)。我已经尝试了11个小时,但无法弄明白。我相信我设置错了,因为NSData是正确的。我该怎么设置这个?

更新

我正在开发一个聊天应用程序,我在表格视图中有聊天消息(这是一个数据数组)。退出应用程序并重新加载时,我需要保存所有聊天记录。我将消息作为字符串输入并将其添加到表的数组中。如果我没有做一个数组,并且我将这些消息作为文本字符串添加到核心数据中,当你重新加载应用程序时,如何将它们添加到表视图的数组中?

@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 个答案:

答案 0 :(得分:1)

布兰登,

首先,在Core Data中,BLOB应该存储在叶子节点中(即一个只包含BLOB和一个关系的实体。)(这种模式/约定已经出现,因为获得保留周期几乎是微不足道的当实体中存在其他关系时,大blob。)

其次,为什么要将这些字符串存储为数组而不是带有时间戳的实体等。?BLOB并不比单个行特别有效,而且系统可以搜索消息并更灵活地存储行。 SQLite特别处理字符串。

第三,看来您正在编写类而不是继承模型实体,为什么?这使您的代码更加复杂。

最后,很难说出你想要做什么。你能包含完整的.h文件吗?和完整的方法声明?

安德鲁