我创建了一个带有一个Entry:UserBase的UserModel.xcdatamodeld,我添加了一个名称为UserID且类型为Integer 32的属性.
之后,我使用file-> new file-> NSManagedOBject子类为它创建类,它自动创建UserBase.h和.m.
在我的控制器中导入了UserBase.h文件,并创建了一个属性:
NSManagedObjectContext *userBaseObjectContext;
Run Code Online (Sandbox Code Playgroud)
同
@property (nonatomic, retain) NSManagedObjectContext *userBaseObjectContext;
Run Code Online (Sandbox Code Playgroud)
在mycontroller.m文件中合成了userBaseObjectContext属性,在DidLoad函数中我尝试了这个:
UserBase *userObject=(UserBase *)[NSEntityDescription insertNewObjectForEntityForName:@"UserBase" inManagedObjectContext:userBaseObjectContext];
[userObject setUserID:[NSNumber numberWithInt:42]];
NSError *error;
if(![userBaseObjectContext save:&error])
{
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Application error" message:@"error" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil,nil];
[alert show];
[alert release];
}
else
NSLog(@"not working...");
Run Code Online (Sandbox Code Playgroud)
当我尝试构建我的项目时,我收到此错误:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_NSEntityDescription", referenced from:
objc-class-ref in LoginController.o
"_OBJC_METACLASS_$_NSManagedObject", referenced from:
_OBJC_METACLASS_$_UserBase in UserBase.o
"_OBJC_CLASS_$_NSManagedObject", referenced from:
_OBJC_CLASS_$_UserBase in UserBase.o
ld: symbol(s) not found for architecture i386
clang: error: linker command …Run Code Online (Sandbox Code Playgroud) 如果实体总是在通过合并相关模型创建的NSManagedObjectModel中使用,是否可以建模在单独的NSManagedObjectModel中定义的实体之间的关系?
例如,假设模型1定义Foo具有关系(一对一)toBar的实体,模型2定义Bar具有关系(一对一)的实体toFoo.我将使用-[NSManagedObjectModel mergedModelFromModels]合并模型1和模型2 来构建CoreData堆栈.有没有办法在数据建模器中或以编程方式定义这些关系,以便它们的行为就像它们是模型内关系一样?
macos cocoa core-data nsmanagedobject nsmanagedobjectcontext
我对CoreData非常精通,并且几年来一直使用它很少或没有困难.对于我的生活,我无法弄清楚为什么
insertNewObjectForEntityForName:inManagedObjectContext:
Run Code Online (Sandbox Code Playgroud)
突然之间又返回了某种奇怪的NSNumber实例.GDB说返回的对象是NSManagedObject的正确自定义子类,但是当我去打印NSManagedObject本身的描述时,我收到以下错误:
*** -[NSCFNumber objectID]: unrecognized selector sent to instance 0x3f26f50
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,我能够使用setValue设置一些关系和属性:forKey:一切都很好.但是当我尝试设置一个特定的关系时,我收到此错误:
*** -[NSCFNumber entity]: unrecognized selector sent to instance 0x3f26f50
Run Code Online (Sandbox Code Playgroud)
我已经尝试了从干净的所有目标,重新启动mac和iPhone,甚至编辑模型,以便所讨论的关系是一个而不是多个.无论我做什么,都会出现同样的问题.有没有人见过这样的事情呢?
我需要制作NSManagedObject而不保存它,我该怎么做?
我想这样做的原因是应用程序有一个设置,用户输入他们的详细信息,但我只想保存对象,如果他们完成设置(他们可以选择取消,在这种情况下,对象需要是丢弃而不保存,这就是为什么我不想直接插入它.
我尝试在没有上下文的情况下插入一个,但应用程序崩溃了.
我尝试过以下方法:
GuestInfo *guest;
guest = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:nil];
Run Code Online (Sandbox Code Playgroud)
这会导致崩溃,并显示以下错误消息:
'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'GuestInfo''
Run Code Online (Sandbox Code Playgroud) core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
有两个实体:作者和书.作者有一个属性authorName和一个to-many关系书.本书有几个属性和一个关系作者.有一个视图控制器(VCAuthor)来编辑Author对象.子视图控制器(VCBook)用于编辑作者的书籍.只有一个managedobjectcontext.在VCBook类中,我将undomanager分组如下
-(void)viewDidLoad
{
NSUndoManager *anUndoManager = [[NSUndoManager alloc] init];
[self.book.managedObjectContext setUndoManager:anUndoManager];
[anUndoManager release];
[self.book.managedObjectContext.undoManager beginUndoGrouping];
}
-(void)cancelAction:(id)sender
{
NSLog(@"%@", self.author.authorName);
[self.book.managedObjectContext.undoManager endUndoGrouping];
[self.book.managedObjectContext.undoManager undoNestedGroup];
self.book.managedObjectContext.undoManager = nil;
NSLog(@"%@", self.author.authorName);
[self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
cancelAction链接到VCBook上的取消按钮,用于撤消VCBook中所做的所有更改.
问题在于:首先,在VCAuthor中,我在UITextfiled authorNameTextField中编辑从奥巴马到大奥巴马的authorName,并通过author.authorName = authorNameTextField.text将其保存到MOC中 - (void)viewWillDisappear:(BOOL)animated {} 方法.然后我进入子视图控制器VCBook编辑作者的书籍,然后单击取消按钮返回到VCAuthor.我发现authorName仍然是奥巴马,这意味着authorName的预期更改已被撤消.authorName的更改根本不在撤消组中,为什么会发生这种情况?PS.当我回到VCAuthor时,我重新加载数据.我只是NSLog在撤消之前和之后的authorName.撤消之前,authorName是改变后的大奥巴马,并在撤消之后成为奥巴马
哎呀,对不起这么长的头衔.
我有一个托管对象上下文,我存储从两个不同位置派生的歌曲.我从手机上的持久存储中获取了一些歌曲(使用Core Data),我从在线数据库中提取了一些歌曲.这两首歌都属于同一个MananagedObject子类.我想这两个歌曲是在一个单一的情况下,因为我想他们两个出现在与NSFetchedResultsController连接的表视图.
当我想保存其中一首歌时会出现问题.我不想将从在线数据库中提取的所有歌曲保存到手机中.我只想保存单曲,所以简单的[moc save]不起作用.另一个问题是,在我保存单曲之后,我仍然希望从在线播放的歌曲在上下文中(但是再次,不保存).我相信我有几个不同的选择:
1)是否可以将NSFetchedResults控制器连接到多个上下文?
2)我可以将从在线数据库中提取的所有歌曲移动到单独的临时上下文中,保存在原始上下文中,然后将所有歌曲移回.(请参阅:如何将NSManagedObject从一个上下文复制或移动到另一个上下文?)
3)记住在线歌曲的所有键值对,从上下文中删除在线歌曲,保存原始上下文,根据保存的键值对将所有在线歌曲插回到原始上下文中.
4)我是一个巨大的n00b,我更容易丢失一些东西.
谢谢!
core-data nsfetchedresultscontroller nsmanagedobject nsmanagedobjectcontext ios
我从文档和这个答案中的理解是,如果数据存在,NSManagedObjectContext existingObjectWithID:error:和objectWithID:方法应返回相同的对象,但是当数据不存在时,existingObjectWithID:error:将返回nil同时objectWithID:返回具有错误而不是数据的对象.
我在应用程序中看到的是一个实例,其中(在子管理对象上下文中的后台线程上创建对象并保存,然后转到主线程,保存并将对象ID从子上下文带到父对象上下文),existingObjectWithID:error:返回nil,但objectWithID:返回具有有效数据的实际可用对象,而不是故障.
我对这两种方法的理解不正确吗?难道我做错了什么?
(我想要nil返回-when-there-no-data行为existingObjectWithID:error:,但是无法获取新创建的对象的数据是有问题的.)
编辑:我想我可以使用objectWithID:,然后立即测试访问try-catch块中返回对象的属性,捕获抛出的异常,并替换伪造的对象nil(如此处所做),但try-catch是昂贵的Objective-C这似乎是一个非常糟糕的主意.
这个问题可能看起来像以前被问过很多次,但我不确定我是否正确地汇总了答案.所以这里.
Apple(WWDC 2012 Session 214)将ObjectID描述为上下文安全的线程安全的.所以我花了一些时间来转换我的代码以利用它.但是,它看起来并不像上下文一样安全,因为这里 讨论的核心数据:子上下文是否会为新插入的对象获取永久的objectID?在其他地方,存在称为永久ID的东西.
关于这个永久性ID业务,我查看了NSManagedObjectContext.h:
/* Converts the object IDs of the specified objects to permanent IDs. This implementation
will convert the object ID of each managed object in the specified array to a permanent
ID. Any object in the target array with a permanent ID will be ignored; additionally,
any managed object in the array not already assigned to a store will be assigned, based on
the same rules Core Data uses for assignment …Run Code Online (Sandbox Code Playgroud) 正如另一个关于SO(以及Apple文档)的问题所指出的,NSManagedObject实例并没有强烈提及NSManagedObjectContext它们的起源.乍一看,这似乎是一个奇怪的决定,因为NSManagedObject如果没有它们context,实例几乎是无用的,因为它会导致混乱的错误,例如在它们应该的时候没有发射的错误.
任何人都可以提供一些背景知道为什么会这样吗?实现一个NSManagedObject自动保存对它的强引用的子类是否危险NSManagedObjectContext?
编辑:由于这个问题的很好的答案,我发现我的托管对象是NSManagedObjectContext由RestKit 故意临时创建的.这是我的下一个问题,特别是RestKit,这里.
core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
我遇到核心数据的有线问题.使用iOS 10中的Swift3,每当我获取或存储数据时,我都会获得托管对象上下文
func getContext () -> NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我有两个实体'User'和'Ledger'.我想为用户分配分类帐,但用户可以有多个分类帐.因此,我有一个UserTableView,我可以在其中显示用户和UserViewController类,我在其中创建一个用户.我对分类账也一样.在创建分类帐时,我还会得到一个所有用户的列表,我从中选择一个用户,哪个用户应该分配到分类帐,反之亦然.
如上所述保存时,我收到错误
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User;
Run Code Online (Sandbox Code Playgroud)
我的数据模型如下所示: 数据模型
任何帮助都非常感谢:)