【问题标题】:Mac OSX - Core data isn't storedMac OSX - 不存储核心数据
【发布时间】:2015-07-14 00:14:06
【问题描述】:

在我的应用程序中,我使用了两个表视图,它们分别绑定到它们的NSArrayController,并且数组控制器设置为使用 Core Data 实体。生成数据时,会创建一个NSObject,并将值与obj.setValue(_:forKey:) 一起存储在其中。在此之后,对象被简单地添加到带有ac.addObject() 的数组控制器中。

让 Core Data 负责数据的持久存储难道还不够吗?

无论如何,如果我尝试通过调用 saveAction() 来保存数据,它会告诉我 MOC 没有更改 (moc.hasChanges = false),因此它甚至不会开始使用此方法保存数据。

为了使 Core Data 正确存储数据并确认更改,我还需要注意什么?

数组控制器在Interface Builder中设置如下:

  • 模式:实体名称
  • 实体名称:“数据模型中的实体名称”
  • 准备内容已检查

它们也正确绑定到托管对象上下文。

我的应用中的简化相关代码:

    /* Clear existing data. */
    let range:NSRange = NSMakeRange(0, arrayController.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    arrayController.removeObjectsAtArrangedObjectIndexes(indexSet);

    let array = generateData();

    /* Generate data. */
    for i in 0 ..< array.count
    {
        let data = array[i];

        /* Create new data object. */
        var obj:NSObject = arrayController.newObject() as! NSObject;
        obj.setValue(data.name, forKey: "name");
        obj.setValue(data.type, forKey: "type");
        obj.setValue(data.category, forKey: "category");

        /* Add it to the array controller's contentArray. */
        arrayController.addObject(obj);
    }

更新:

看起来我的应用在启动时正在实例化四个 MOC。我怀疑我在故事板中为两个数组控制器添加它们的方式是错误的。我向两个表视图控制器(也包含它们的数组控制器)添加了一个 NSObject 并将它们的基类设置为我的CoreDataDelegate(这是我的核心数据代码类,通常在AppDelegate 中)。我怀疑这是创建CoreDataDelegate 的多个实例的地方。问题是:我应该如何正确地执行此操作,以便阵列控制器可以访问我的 CoreDataDelegate 类?

【问题讨论】:

  • 您创建了一个NSObject?显示代码
  • 我的代码有点复杂,分为几个类等,但我会尝试做一个组合示例......
  • 我已经添加了代码示例。
  • 应该没问题。您何时以及如何保存(您可以有多个上下文,还是没有上下文)?
  • 跟随@wain 进入兔子洞...您在上下文中调用 save ,然后在持久性协调器上调用它 .. 然后将其保存到适当的位置(这取决于您的配置可以是 RAM(可能是易失性的,或者磁盘或云/磁盘等))

标签: ios macos swift core-data nsarraycontroller


【解决方案1】:

我将核心数据委托类设为 Singleton,它为我解决了问题...

class CoreDataDelegate : NSObject
{
    static let instance = CoreDataDelegate();
    ...
}

然后我在我的 AppDelegate(也是一个单例)中有一个对它的引用......

@NSApplicationMain
class AppDelegate : NSObject, NSApplicationDelegate
{
    static let instance = AppDelegate();
    let coreData:CoreDataDelegate;

    override init()
    {
        coreData = CoreDataDelegate.instance;
        super.init();
    }

    ...
}

然后在情节提要中,我向两个表视图控制器添加了一个 NSObject,并将基类设置为 AppDelegate。然后通过 AppDelegate/coreData.moc 将 ArrayControllers 绑定到 moc。

现在只创建了一个 CoreDataDelegate 实例(因此只创建了一个 moc),我可以高兴地报告现在保存工作正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多