【问题标题】:Core Data Managed Object Context Saving Problem核心数据托管对象上下文保存问题
【发布时间】:2011-09-01 16:42:19
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

  • 我真的不知道这里应该发生什么。你有 managedObject 和 [self managedObject]。我是否正确假设这些是同一件事?但是您在检查它是否为零之前向它发送了一条消息。那会发生什么?如果它不是 nil,它将不会运行任何插入到模型中的代码。因此,如果您之前将 managedObject 插入到您的模型中,我不知道。您在这两种情况下都创建了一个获取请求,但您从未执行过它。它采用什么代码路径?保存上下文后是否检查了错误的值?
  • 需要第二个。而且它没有任何错误,但它的 Nill...

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


【解决方案1】:

布兰登,

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

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

第三,你似乎是在编写你的类而不是从你的模型实体继承,为什么?这会使您的代码更加复杂。

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

安德鲁

【讨论】:

  • 我正在开发一个聊天应用程序,并且我在表格视图中有聊天消息(它是一个数据数组)。当您退出应用程序并重新加载它时,我需要保存所有聊天记录。我将消息作为字符串输入,并将其添加到表格的数组中。如果我没有做一个数组,而是将消息作为文本字符串添加到核心数据中,当您重新加载应用程序时,我如何将它们添加到表格视图的数组中?
  • Brandon,NSFetchedResultsController 专门设计用于从核心数据模型中获取数组,并以自然的方式与 UITableView 交互。 IOW,它解决了你的问题。安德鲁
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多