我在一个简单的Core Data项目中崩溃了.
我用Core Data创建了一个新的空iPhone项目.两个实体被添加到数据模型中,它们之间具有一对一的反向关系.两者都有自动生成的NSManagedObject子类.实体名称和类都设置在两者上.
DBMove
attribute: moveValue:Integer16
relationship: newPosition -> DBPosition (inverse: move)
DBPosition
attribute: positionValue:Integer16
relationship: move -> DBMove (inverse: newPosition)
Run Code Online (Sandbox Code Playgroud)
有一个自定义视图控制器,可以创建DBMove和DBPosition.然后它设置它们之间的反比关系并保存它.从app delegate中检索托管对象上下文; 我认为这是安全的,因为[NSThread isMultiThreaded]返回false.
- (void)newEntries
{
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;
DBPosition *newPos = [NSEntityDescription
insertNewObjectForEntityForName:@"DBPosition"
inManagedObjectContext:context];
newPos.positionValue = [NSNumber numberWithInt:5];
DBMove *newMove = [NSEntityDescription
insertNewObjectForEntityForName:@"DBMove"
inManagedObjectContext:context];
newMove.moveValue = [NSNumber numberWithInt:2];
newPos.move = newMove;
NSError *error;
if (![context save:&error]) {
NSLog(@"Save error: %@", [error localizedDescription]);
}
}
Run Code Online (Sandbox Code Playgroud)
视图控制器然后提取所有DBMoves.他们的Integer16属性按预期输出. [编辑]访问关系会导致main :: @ …
我在测试、开发或使用过程中遇到了一些我从未经历过的崩溃。
我可以在 Fabric Dashboard 上看到它们,它涉及 NSManagedObjectContext。
这是对 StackTrace 的第一次调用:
CDFavori* fav = [CDFavori favoriWithIndicatif:homeFavoriteIndicatif context:[MyAppDelegate mainContext]];
Run Code Online (Sandbox Code Playgroud)
CDFavori 是一个表示 CoreData 对象的类,它被扩展以实现一些方法(为了获取):
+(CDFavori *)favoriWithIndicatif:(NSString*)indicatif context:(NSManagedObjectContext*)context
{
if (nil == indicatif || nil == context)
return nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"CDFavori"];
[request setPredicate:[NSPredicate predicateWithFormat:@"indicatif LIKE %@", indicatif]];
NSError *error = nil;
NSArray *favoris = [context executeFetchRequest:request error:&error];
CDFavori *fav = nil;
if (nil != error) {
DDLogError(@"Error = %@ (%@)", indicatif, error);
} else if (0 < [favoris count])
{
fav …Run Code Online (Sandbox Code Playgroud) core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
我正在使用核心数据,但我对NSManagedObjectContext. 我使用以下代码来保存我的图书数据。书籍数据保存在我的应用程序扩展一侧,如下所示。扩展侧代码块的调用方式与主线程不同,如图所示。

我想知道这是否会因为滥用我的上下文而导致问题?
func saveBook() {
let book: Book = Book(context: viewContext)
let uuid = UUID()
book.sessionId = uuid
book.appId = session.appId
book.startedAt = session.startedAt
book.createdBy = AppData.installId
coreData.saveSync()
}
func saveSync() {
let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateContext.parent = viewContext
privateContext.perform {
do {
try privateContext.save()
viewContext.performAndWait {
do {
try viewContext.save()
} catch {
let nsError = error as NSError
print("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
} catch {
let nsError = error as NSError
print("Unresolved …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,用户可以在其中选择要显示位置的特定主题。我将选定的主题objectID存储在NSUserDefaults中,以便在应用程序重新启动时,选定的主题仍将保持不变。
在整个应用程序中,我会参考此选定主题。我目前有一个用于保存objectID的类变量,但是有时我需要检索对象本身的属性(即name属性)。为此,我从核心数据中检索对象,然后访问我的值。
我担心这样做所需的处理时间,所以我的问题是-更好的选择是什么?
1)每次需要访问属性时,将objectID存储在内存中并查询核心数据以检索对象。我认为这在内存使用量较少的情况下比较便宜,但是在处理方面却比较昂贵。
2)将actaul对象存储在内存中,然后在需要时直接访问该对象。我认为这在处理方面更便宜,但在内存使用方面可能会更昂贵。
NSManagedObjects是否带有任何类型的唯一标识符?
我需要获取几个对象,但很可能它们具有相同的属性,所以在获取这些对象之后,我怎样才能区分它们?
谢谢.
我有以下内容NSManagedObjects:
Product <<->> ProductAttribute <->> ProductAttributeOption
Run Code Online (Sandbox Code Playgroud)
使用NSPredicate ProductAttributeOption根据产品获取s 的正确方法是什么?
我没试过就试过以下内容:
[NSPredicate predicateWithFormat:@"ANY SELF.productAttribute.products MATCHES %@", product]
[NSPredicate predicateWithFormat:@"ANY SELF.productAttribute@distinctUnionOfSets.products MATCHES %@"", product]
[NSPredicate predicateWithFormat:@"ANY SELF.productAttribute.@distinctUnionOfSets.giftProducts LIKE[cd] %@", self.giftProduct]
Run Code Online (Sandbox Code Playgroud)
有什么建议?谢谢!
core-data relationship nspredicate nsfetchedresultscontroller nsmanagedobject
当我使用核心数据创建实体然后NSManagedObject从中生成子类时,我得到以下输出(在.h中):
@class Foo;
@interface Foo : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *otherValues;
@end
Run Code Online (Sandbox Code Playgroud)
但是,在我的.m文件中,我想使用name和otherValues值.通常我会创建几个ivars,然后根据需要为它们添加属性.这样我就可以轻松地在我的.m文件中访问它们.
在这种情况下这样做是否可以接受?将ivars添加到.h(for name和otherValues)会导致持久性和检索对象中的任何异常行为吗?
我想确保我正在使用的NSManagedObject具有永久NSManagedObjectID.我知道它只在[NSManagedObjectContext save:]或[NSManagedObjectContext obtainPermanentIDsForObjects:error:]上永久化.但是,在我保存上下文以获取永久ID之前,有没有办法确定对象是否具有永久ID?这样我就不会不必要地保存商店.
我确实一直在这个问题上停留,我已经提到了这个 stackoverflow帖子,但是我的应用程序仍然因该问题而崩溃:
无法在NSManagedObject类上调用指定的初始化程序
因此,我有多个实体,并且将子类化NSManagedObject。假设我有一个名为的实体:FirstEntity, SecondEntity, ThirdEntity, Fourth Entity, FifthEntity.假设我有两个firstAttribute, secondAttribute在每个实体中命名的属性。我进入xcdatamold打开的编辑器,然后为我的所有实体选择创建NSManagedObject子类。然后,我想实例化每个新的NSManagedObject子类,以便可以访问中的属性FirstEntity。所以我写了这段代码:
let firstEntity = FirstEntity()
Run Code Online (Sandbox Code Playgroud)
然后,当我运行该应用程序时,它崩溃了,所以我用stackoverflow帖子中的提示对其进行了进一步编辑,现在这是我的代码:
let firstEntityName = NSEntityDescription.entityForName("FirstEntity", inManagedObjectContext: managedObject)
let firstEntity = FirstEntity.init(entity: firstEntity!, insertIntoManagedObjectContext: managedObject)
Run Code Online (Sandbox Code Playgroud)
但是,我的代码仍然崩溃。我真的很无能为力,因为所有与该问题有关的堆栈溢出操作都可以完成上述操作,但是我的代码仍然崩溃,无法在NSManagedObject类错误上调用指定的初始化程序。
有什么建议么?
我目前如何使用核心数据:
我的应用程序加载:在此页面上,我创建一个托管对象上下文,获取托管对象,并加载/显示它们.这是一个tableview,所以我允许删除.为了删除我创建一个托管对象上下文并删除托管对象并重新加载tableview.在我的应用程序中使用了相同的方法,还有其他操作,例如更新等. 重点是每个动作我创建一个新的托管对象上下文.
我目前对核心数据的理解是,托管对象上下文有点像队列,它充满了行为.其中,托管对象是正在修改的项目,并放入队列以执行操作.使用这个逻辑,整个应用程序中不应该只有一个队列吗?
主要问题:
我是否需要在每个操作之前创建托管对象上下文?或者我可以创建一个托管对象上下文说在应用程序委托确实完成启动?并在整个应用程序中使用它?
编辑:
对于未来的观众(如果我理解提供的答案),我的代码现在通常如下所示:
ManagedObjectContext.在我需要更改我的核心数据对象的整个应用程序中,我执行以下操作:
if let managedContext = ShareData.sharedInstance.managedObjectContext {
// DO STUFF, update, delete, create ect ect ect
}
编辑2:我可能误解了"不要在App代理中创建MOC",目前正在研究这个并尝试学习创建MOC的最佳位置.在其他地方创建一个似乎很乏味,如果每个视图都可以启动应用程序,则需要MOC.
nsmanagedobject ×10
core-data ×9
ios ×5
objective-c ×5
iphone ×3
swift ×3
nspredicate ×1
relationship ×1