Mac OSX - 核心数据未存储
Mac OSX - Core data isn't stored
在我的应用程序中,我使用了两个 table 视图,它们分别绑定到它们的 NSArrayController
并且数组控制器设置为使用核心数据实体。生成数据时,会创建一个 NSObject
并使用 obj.setValue(_:forKey:)
将值存储在其中。在此之后,使用 ac.addObject()
.
将对象简单地添加到数组控制器中
这是否足以让 Core Data 负责数据的持久存储?
无论如何,如果我尝试通过调用 saveAction() 来保存数据,它会告诉我 MOC 没有任何变化 (moc.hasChanges = false
),所以它甚至不会开始保存数据方法。
我还需要注意什么才能让 Core Data 正确存储数据并确认更改?
数组控制器在Interface Builder中设置如下:
- 模式:实体名称
- 实体名称:'name of entity in data model'
- 准备检查内容
它们也正确绑定到托管对象上下文。
来自我的应用的简化的相关代码:
/* 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。我怀疑我将它们添加到两个阵列控制器的情节提要中的方式是错误的。我向两个 table 视图控制器(它们也包含它们的数组控制器)添加了一个 NSObject 并将它们的基础 classes 设置为我的 CoreDataDelegate
(这是我的 class通常在 AppDelegate
中的核心数据代码)。我怀疑这是创建 CoreDataDelegate
的多个实例的地方。问题是:我应该如何做才能使阵列控制器可以到达我的 CoreDataDelegate
class?
我将我的核心数据委托 class 设为单例,这为我解决了问题...
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();
}
...
}
然后在情节提要中,我向我的两个 table 视图控制器添加了一个 NSObject,并将基础 class 设置为 AppDelegate。然后通过 AppDelegate/coreData.moc.
将 ArrayControllers 绑定到 moc
现在只创建了一个 CoreDataDelegate 实例(因此只创建了一个 moc),我可以很高兴地报告现在保存有效了!
在我的应用程序中,我使用了两个 table 视图,它们分别绑定到它们的 NSArrayController
并且数组控制器设置为使用核心数据实体。生成数据时,会创建一个 NSObject
并使用 obj.setValue(_:forKey:)
将值存储在其中。在此之后,使用 ac.addObject()
.
这是否足以让 Core Data 负责数据的持久存储?
无论如何,如果我尝试通过调用 saveAction() 来保存数据,它会告诉我 MOC 没有任何变化 (moc.hasChanges = false
),所以它甚至不会开始保存数据方法。
我还需要注意什么才能让 Core Data 正确存储数据并确认更改?
数组控制器在Interface Builder中设置如下:
- 模式:实体名称
- 实体名称:'name of entity in data model'
- 准备检查内容
它们也正确绑定到托管对象上下文。
来自我的应用的简化的相关代码:
/* 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。我怀疑我将它们添加到两个阵列控制器的情节提要中的方式是错误的。我向两个 table 视图控制器(它们也包含它们的数组控制器)添加了一个 NSObject 并将它们的基础 classes 设置为我的 CoreDataDelegate
(这是我的 class通常在 AppDelegate
中的核心数据代码)。我怀疑这是创建 CoreDataDelegate
的多个实例的地方。问题是:我应该如何做才能使阵列控制器可以到达我的 CoreDataDelegate
class?
我将我的核心数据委托 class 设为单例,这为我解决了问题...
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();
}
...
}
然后在情节提要中,我向我的两个 table 视图控制器添加了一个 NSObject,并将基础 class 设置为 AppDelegate。然后通过 AppDelegate/coreData.moc.
将 ArrayControllers 绑定到 moc现在只创建了一个 CoreDataDelegate 实例(因此只创建了一个 moc),我可以很高兴地报告现在保存有效了!