我在保存单个Object时遇到问题,而不是保存NSMangedObject堆栈中的所有对象?

时间:2013-02-18 12:08:49

标签: ios sqlite core-data nsmanagedobject nsmanagedobjectcontext

我是IOS编程的新手,目前正在学习核心数据,我开始运行代码,我只需要保存核心数据中的特定对象。那我怎么能这样做呢?

根据场景,我有来自服务器和本地存储(核心数据)的数据,但是当用户关闭应用程序(转到后台)时,我想将数据存储在服务器中(如果网络可用),如果没有然后在本地存储(但只选择 - 意味着应该存储特定数据,有来自在线服务器的对象,我不想存储在本地)。

如果可能,请告诉我任何解决方案。

此致 尼萨尔艾哈迈德

2 个答案:

答案 0 :(得分:1)

我认为有两种方法可以做到这一点:

  1. 迭代插入和更新的对象,并还原那些您不会保存的对象。应删除插入的对象,更新应更新:

    for (NSManagedObject* obj in [self.managedObjectContext insertedObjects]) {
        if (/*Shouldn't be saved*/) {
            [self.managedObjectContext deleteObject:obj];
        }
    }
    
    for (NSManagedObject* obj in [self.managedObjectContext updatedObjects]) {
        if (/*Shouldn't be saved*/) {
            [self.managedObjectContext refreshObject:obj mergeChanges:NO];
        }
    }
    
  2. 创建单独的托管对象上下文。重新创建要在新上下文中保存的对象,然后保存它。

    NSManagedObjectContext* newContext = [[NSManagedObjectContext alloc] init];
    [newContext setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
    for (NSManagedObject* obj in objectsWantToSave) {
        NSEntityDescription* entity = [obj entity];
        NSDictionary* valuesByKeys = [obj dictionaryWithValuesForKeys:[[entity attributesByName] allKeys]];
        NSManagedObject* objCopy = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:newContext];
        [objCopy setValuesForKeysWithDictionary:valuesByKeys];
    }
    [newContext save:NULL];
    
  3. 第二种方法对我的意见更好。

答案 1 :(得分:0)

查看UIManagedDocument - http://developer.apple.com/library/ios/#documentation/uikit/reference/UIManagedDocument_Class/Reference/Reference.html

它处理了使用核心数据所涉及的许多样板。