我有一个用户界面来插入一个Transaction.一旦用户点击加号,他就会获得屏幕,我想要实例化我的核心数据NSManagedObject实体,让用户使用它.然后当用户点击"保存"按钮时,我将调用保存功能.
所以到代码:
transaction = (Transaction *)[NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:self.managedObjectContext];
//even if i dont call save: its going to show up on my table
[self.managedObjectContext save:&error]
Run Code Online (Sandbox Code Playgroud)
PS我在该表上使用NSFetchedResultsController,我看到NSFetchedResultsController正在向表中插入一个节和一个对象.
我的想法是,如果有一种方法来实例化事务NSManagedObject我可以更新它而不保存直到客户选择.
我正在开发一个Cocoa-Touch应用程序,它使用CoreData并且有一些由XCode模型编辑器生成的NSPersistentObject子类.
我注意到最近,当保存上下文时,我得到一个错误,其中包含以下部分的用户信息:
(gdb) po ui {
"Dangling reference to an invalid object." = <null>;
NSAffectedObjectsErrorKey = <dump #1 of someObject>;
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1550.)";
NSValidationErrorKey = <someKey pointing to someObject #1>;
NSValidationErrorObject = <dump #2 of someOtherObject which points to the dump #1 object>;
NSValidationErrorValue = { <list of someMoreObjects> };
}
Run Code Online (Sandbox Code Playgroud)
用户信息字典中还有其他键.
我得到的所有转储都是有效的对象,我已经验证了所有这些.
NSValidationErrorObject是其具有的对象NSSet包含在倾倒类型的对象NSAffectedObjectsErrorKey和NSValidationErrorValue.但所有这些对象都是有效的.
此外,这是随机发生的,有时会发生,有时不会发生,有时倾倒的列表NSValidationErrorValue更长,有时更短.
我不知道为什么会发生这种情况,或者究竟是什么错误.有谁知道发生了什么?什么可能导致这个奇怪的错误?
我正在开发一个应用程序,它将对在线服务执行搜索并生成许多Result对象.Result对象是NSManagedObject,通过将其与NSManagedObjectContext相关联来根据需要进行初始化.
用户应该能够选择"结果"并将其另存为"收藏夹".在应用程序中,这就像将Result实体与新的Favorite实体相关联并保存上下文一样简单.
问题是当然上下文中的每个结果都会与我想要收藏的结果一起保存到数据库中.
我已经看到许多使用多个NSManagedObjectContext实例来管理各种创建和持久性情况的示例.所有这些似乎都围绕着用一个Context创建新实例然后将它们合并到另一个上下文中以避免另一个FetchRequest执行的想法.这些示例无法解决问题,因为它们仍会导致保存每个Result实体.
有人有什么建议吗?我完全了解了这一点.
您好(实际问题在底部).
在iOS 5中,在CoreData中引入了父子管理对象上下文.
我有一个标准的NSFetchedResultsController和UITableVeiwController一起工作,从商店中获取主列表.获取的结果控制器的托管对象上下文是具有父上下文的子项:
// AppDelegate.m
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// primary managed object context has NSPrivateQueueConcurrencyType
[__managedObjectContext setParentContext:[self primaryObjectContext]];
return __managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)
表视图控制器提供了一个模态视图控制器来添加新记录,但使用单独的托管对象上下文来执行此操作(此上下文是父上下文的另一个子级).此上下文保存在表视图控制器的委托回调中:
- (void)addGame
{
// New child context
[self setBuildManagedObectContext:[[NSManagedObjectContext alloc] init]];
[[self buildManagedObectContext] setParentContext:[[[self team] managedObjectContext] parentContext]];
Team *buildTeam = (Team *)[[self buildManagedObectContext] objectWithID:[[self team] objectID]];
Game *buildGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game"
inManagedObjectContext:[self buildManagedObectContext]];
[buildGame setTeam:buildTeam];
BuildViewController *buildVC = [[BuildViewController alloc] initWithGame:buildGame delegate:self];
UINavigationController …Run Code Online (Sandbox Code Playgroud) 我对如何使用一些核心数据的NSManagedObject子类来处理持久数据和非持久数据有一些想法.
假设您有一个配方应用程序,显示您自己的CoreData配方列表,在同一个应用程序中,您也可以搜索其他用户配方.这些其他用户配方当然来自API,我们不希望将它们保存到核心数据中.但我们想要的是我们的配方细节View Controller,无论是给定持久配方还是非持久性配方,它都可以起作用.我自然认为我们应该在数据周围使用相同的对象包装器,让我们的View Controller对数据的来源视而不见.
问题是NSManagedObject子类不能手动初始化,必须插入上下文.这对我们的其他用户食谱不利.另一方面,对于我们自己的配方,我们需要将这些对象插入到上下文中.
我有几个解决方案,但我真的很想看看你们对这个问题的看法.
您是否认为这是一些实现问题,应该通过将两个数据对象包装到一个对象中来解决?例如,通过覆盖所有getter和setter来处理coredata对象和NSDictionary对象?
或者它是一个体系结构问题,您可以通过嵌套NSManagedContext或使用多个持久性存储(一个在内存中,另一个在Sqlite中)来解决它?
在iOS 7(及更早版本)中,有能力有效地创建"临时" NSManagedObject,并可以选择稍后将其添加到上下文并保留它,如下所示:
NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
User* user = [[User alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
Run Code Online (Sandbox Code Playgroud)
请注意nilNSManagedObjectContext参数.(查看马库斯S. Zarra的回答这个方法在这里)
但是,iOS 8已经更改了关系的管理方式,因此如果您在设置其上下文之前创建临时对象并添加关系,则在重新启动时将删除该关系:
User* user = [User temporaryEntity];
[user addPhotosObject:photo];
[managedObjectContext:insertObject:user];
[managedObjectContext:&error];
Run Code Online (Sandbox Code Playgroud)
这不会影响非关系对象,但确实无法创建具有关系的临时对象.
有谁知道如何解释这一变化并创建/使用临时工作NSManagedObject?谢谢!
-
此外,检查出这个在iOS 8论坛相关帖子.
core-data objective-c nsmanagedobjectcontext ios magicalrecord