我希望每当添加某种类型的实体(并且可能更改/删除)时都会收到通知.
我通过向managedObjectContext添加一个观察者来读取它是可能的.但是,我还没有找到实际的方法.
我在做:
[context addObserver:self forKeyPath:@"{myEntityName}" options:{I have tried several different values, but I am failing to understand which one to use} context:@"NewEntity"];
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
注意:我显然是coredata/cocoa/objective-c的新手,这可能是非常基本的,但一直在追逐答案.无法找到关于如何正确观察上下文对象的更改的示例和/或解释(我已经能够观察到特定实体的更改而没有问题).
顺便说一句:这是一个类似的问题,表明这是可能的,但我缺乏细节:核心数据:观察某些类型的实体的所有变化
core-data nsnotifications nsmanagedobject nsmanagedobjectcontext
我想覆盖awakeFromFetch和awakeFromInsert.
当我保持自动生成的NSManagedObject子类不变并将我的自定义代码放入类别时,我的问题是:
我在哪里放置awakeFromFetch并awakeFromInsert正确调用这些方法?
core-data objective-c nsmanagedobject ios objective-c-category
import UIKit
import CoreData
class Period1Controller: UIViewController, UITextFieldDelegate {
@IBOutlet weak var enterName: UITextField!
@IBOutlet weak var presentName: UITextView!
@IBOutlet weak var independceStatue: UITextField!
@IBOutlet weak var driverSelection: UITextField!
var entitys = [NSManagedObject]()
var nameList : [String] = []
var period1 = ""
var period1NameList = ""
override func viewDidLoad() {
super.viewDidLoad()
}
func setValues() {
nameList = [enterName.text!]
}
//this button is for saving the element into the core data
@IBAction func setName(sender: UIButton) {
setValues()
for item in …Run Code Online (Sandbox Code Playgroud) [managedObjectContext refreshAllObjects]
Run Code Online (Sandbox Code Playgroud)
实际上,我在保存上下文期间的某个时候遇到随机错误,当我[managedObjectContext refreshAllObjects]在错误后调用时,它允许我保存。
任何人都可以请指导我这种方法。
我在核心数据中有一个实体,我尝试从两个不同的上下文更新它。我正在存储我需要更新的托管对象的 managedObjectID,因为它是线程安全的。在更新我的对象之前,我刷新对象以避免合并冲突。这是我的代码:
context1.performBlock {
let myObject = context1.objectWithID(managedObjectId)
context1.refreshObject(myObject, mergeChanges: true)
myObject.property1 = newValue
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有在此处保存上下文,因为我想将这些更改作为其他更新事务的一部分提交。
对于同一个对象,我还有一些其他属性需要立即提交,因此我为此创建了单独的上下文以防止 property1 立即提交。
context2.performBlock {
let myObject = context2.objectWithID(managedObjectId)
context2.refreshObject(myObject, mergeChanges: true)
myObject.property2 = newValue
do {
try context2.save()
}
catch {}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中context2,我已经更新了property2,它将立即提交给 db,但在我的情况下这不是那么频繁的更新。在context1我更新property1的频率(以every1秒),我提交它每10秒(请注意,我每次更新property1,我刷新对象,所以我会得到更新的价值property2一旦被改变context2)。
这在大多数情况下都可以正常工作,但有时我会遇到合并冲突。我不知道为什么每次刷新对象后我都会遇到合并冲突。
此外,我的控制台向我显示了相同的对象,除了托管对象的版本,所以如果所有属性都与版本更新的方式相同?
控制台日志:
错误域=NSCocoaErrorDomain 代码=133020 “无法合并更改。” UserInfo={conflictList=( "NSMergeConflict (0x17fa78f0) for NSManagedObject (0x18751830) with objectID '0x170f1ca0' with oldVersion = 8 and newVersion = 9 and old …
core-data nsmanagedobject nsmanagedobjectcontext ios merge-conflict-resolution
我怎样才能做NSManaged public var一个可选的布尔值?当我输入以下内容时:
import Foundation
import CoreData
import UIKit
extension SomeClass {
@NSManaged public var isLiked: Bool?
@NSManaged public var isDisliked: Bool?
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
属性不能被标记为@NSManaged 因为它的类型不能在 Objective-C 中表示
我想是可以既不是财产liked或disliked。
我对我的模型进行了一些更改(但我还不想迁移,所以我只删除应用程序,构建干净等)
但是,当我在iPhone或模拟器上运行它时,我收到以下错误:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'executeFetchRequest:error:获取请求必须有一个实体.
我像这样设置实体:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
我的managedObjectContext不是nil.但我怀疑它没有正确加载对象模型或类似的东西,因为如果我在模型中显示实体,列表为空:
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSLog(@"%d", [[managedObjectModel entities] count]);
Run Code Online (Sandbox Code Playgroud)
如何确保加载模型?
我有一个名为catObras的实体类,它继承自NSManagedObject类.我想要做的是通过JSON格式的Web服务(POST)传递它.如果我发送了这个对象,我会收到:
<catObras: 0x6d879f0> (entity: catObras; id: 0x6d859b0 <x-coredata://41B60B06-248C-488D-A14C-894E04D0395F/catObras/p2> ; data: {
Reporte = "<relationship fault: 0x6d9dc40 'Reporte'>";
calendarioVisitas = "<relationship fault: 0x6dac2c0 'calendarioVisitas'>";
catFondosInversion = "<relationship fault: 0x6d7a1b0 'catFondosInversion'>";
contratista = nil;
contrato = "XX-AYTO-ENS-BC-HABITAT-2011-IS-01";
descripcion = "AMPLIACION DE RED DE DRENAJE SANITARIO COL. VISTA HERMOSA";
direccion = nil;
estatus = nil;
fechaAprobacion = "2012-01-01 08:00:00 +0000";
fechaInicio = "2012-01-31 08:00:00 +0000";
fechaTerminacion = "2012-03-10 08:00:00 +0000";
fechaUltimoRep = nil;
idAgrupacion = 0;
idObra = 5;
inversionAprobada = 0;
inversionAutorizada …Run Code Online (Sandbox Code Playgroud) 我是新手core data,我正试图让我的头脑如何利用NSManagedObjects.基本上我有几个我打算使用的对象core data(彼此之间有关系).
在查看核心数据之前,我写了一个由3组成的基本模型NSObjects,现在我已经从这个模型创建了一个core data model并生成了3个NSManagedObjects.我在现有的3中有一些逻辑NSObjects(例如指定的初始化器和专门的getter和setter),我仍然想要使用它.
我的问题是,是否我可以从3转移逻辑NSObjects直接到3 NSManagedObjects,然后使用它们,因为我会在我的原始设计(同额外的好处是能够很容易地坚持他们),或者我是否需要同时保留NSObjects为以及NSManagedObject.
请有人就最佳设计实践提出建议,我希望尽可能保持我的代码清洁和结构良好.
提前致谢!
我有一个NSManagedObject子类,需要在正确返回之前完成它(它的所有字段都是非选项),所以当我执行init时,首先我使用一个guard来确保数据(来自JSON)是正确的如下:
public init(context: NSManagedObjectContext, dictionary: [String: AnyObject]) throws {
guard
let modified_on = date(dictionary["modified_on"] as? String),
let start_on = date(dictionary["start_on"] as? String),
let end_on = date(dictionary["end_on"] as? String),
let ticket_name = dictionary["ticket_name"] as? String
else {
throw ErrorParseModel.ErrorParsing
}
...
...
Run Code Online (Sandbox Code Playgroud)
问题是编译器返回一个错误,Super.init isn't called before returning from initializer因为这个init方法可能抛出异常而不调用super.init之前.
我的家伙是关于如何进行的:1.我之前是否应该打电话给super.init并创建一个"虚拟对象"而不是后卫?在这种情况下,我应该从上下文中删除此对象之前抛出异常?2.在此警卫之前我可以做的另一个测试是确保entityName正确如下:
guard let entity = NSEntityDescription.entityForName(Ticket.entityName, inManagedObjectContext: context) else {
return
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我无法在上下文中创建对象,因为我没有实体,所以我不可能(我认为)在一个上下文中创建一个nil-entity对象.
有关如何进行的任何建议?
谢谢!