标签: nsmanagedobjectcontext

NSManagedObjectContext -save:导致 SIGSEGV 崩溃

我看到我的应用程序有几个具有相同核心数据堆栈跟踪的崩溃报告:

在此输入图像描述

我无法重现此崩溃,但我认为这与级联删除关系有关NSManagedObject_propagatePendingDeletesAtEndOfEvent:这是通过堆栈跟踪中看到的调用来判断的。我NSManagedObjectContext的设置如下:

- (NSManagedObjectContext*)managedObjectContext {
    if (_managedObjectContext == nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    }
    return _managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)

关于什么可能导致-save:整个应用程序中的堆栈跟踪调用崩溃的任何想法?

core-data objective-c nsmanagedobjectcontext ios

2
推荐指数
1
解决办法
955
查看次数

当上下文初始化为内联时,为什么 NSManagedObject 不会插入到子 NSManagedObjectContext 中?

NSManagedObjectContext在我的 iOS 应用程序中使用 child 作为便签本。我正在使用 的扩展NSManagedObjectContext来创建子上下文,如下所示:

extension NSManagedObjectContext {
    func childContext(concurrencyType: NSManagedObjectContextConcurrencyType = .mainQueueConcurrencyType) -> NSManagedObjectContext {
        let childContext = NSManagedObjectContext(concurrencyType: concurrencyType)
        childContext.parent = self
        return childContext
    }
}
Run Code Online (Sandbox Code Playgroud)

NSManagedObject当将新的内容插入新的子上下文(从viewContexta创建NSPersistentContainer)时,我的应用程序的一部分重复出现错误,并显示以下消息:

CoreData:错误:从上下文中删除托管对象后对其进行更改

这很奇怪,因为应用程序的其他部分(也使用子上下文)运行良好。NSManagedObject最终,我将原因缩小到将新的(实体名称“Book”)插入新的子上下文的方式上的一个小差异。以下内容按预期工作:

let childContext = container.viewContext.childContext()
let object1 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: childContext)
print(object1.managedObjectContext == nil)
// prints "false"
Run Code Online (Sandbox Code Playgroud)

但是,如果我内联创建子上下文(即未分配给变量,则托管对象不会插入到上下文中):

let object2 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: container.viewContext.childContext())
print(object2.managedObjectContext == nil)
// prints "true"
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪并且无法弄清楚。一切都在主线程上运行。我还创建了一个Swift …

core-data nsmanagedobject nsmanagedobjectcontext ios swift

2
推荐指数
1
解决办法
871
查看次数

为什么在重新启动应用程序或我执行 NSBatchDeleteRequest 两次之前不会删除条目?

我正在阅读删除/重置 Core Data 中的所有条目?.

如果我按照以下步骤操作,会得到意想不到的结果:

  1. 调用下面的代码
  2. 然后在模拟器中查询一个实体,我会取回一个实体!!!
  3. 如果我clearCoreDataStore再次调用(或重新启动),则不会从核心数据中检索该值

我错过了什么?

func clearCoreDataStore() {
    let entities = dataManager.persistentContainer.managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.execute(deleteReqest)
        } catch {
            print(error)
        }
    }
    dataManager.saveContext()
}
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject nsmanagedobjectcontext ios nsbatchdeleterequest

2
推荐指数
1
解决办法
359
查看次数

Swift 中出现错误“尾随闭包传递给类型为‘NSManagedObjectContext’的参数,该参数不接受闭包”

我尝试在 Swift 中向我的应用程序添加实时活动。但是,当我尝试运行该应用程序时,出现错误消息“尾随闭包传递给不接受闭包的‘NSManagedObjectContext’类型的参数”。我的应用程序使用 Core Data 来保存我的应用程序的数据。

class HabitManager: ObservableObject {
    private var activity: Activity<HabitsWidgetAttributes>? = nil

    func startHabit(name: String, symbol: String, currentTask: String) {
        let attributes = HabitsWidgetAttributes(name: name, symbol: symbol)
        let state = HabitsWidgetAttributes.ContentState(currentTask: currentTask)
    
        activity = try? Activity<HabitsWidgetAttributes>.request(attributes: attributes, contentState: state)
    }

    func updateActivity(nextTask: String) {
        let state = HabitsWidgetAttributes.ContentState(currentTask: nextTask)
    
        Task { // Line where the error is generated
            await activity?.update(using: state)
        }
    }

    func stopActivity() {
        let state = HabitsWidgetAttributes.ContentState(currentTask: "Finished")
    
        Task { // Line where …
Run Code Online (Sandbox Code Playgroud)

nsmanagedobjectcontext swift activitykit

2
推荐指数
1
解决办法
1130
查看次数

如何将ManagedObjectContext与线程一起使用

这可能是一个非常直接的应用程序,但我是Objective-C(来自Java)的新手,整个内存管理和"EXC_BAD_ACCESS"错误让我心碎.

我有一个普通的NavigationController iPhone App,带有Core Data.在AppDelegate中创建NSManagedObjectContext并将其传递给RootViewController.从主线程直接查找视图以填充表,这似乎工作正常.

该应用程序是某种RSS类型的阅读器,因此只要应用程序启动,我就会触发一个线程来获取新数据并更新视图:

-(void)updateData:(id)sender {
 UIActivityIndicatorView *activityIndicator =
    [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
 [activityIndicator startAnimating];
 UIBarButtonItem *activityItem =
    [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
 [activityIndicator release];
 self.navigationItem.leftBarButtonItem = activityItem;
 [activityItem release];

 // Start thread to update the data
 [NSThread detachNewThreadSelector:@selector(doUpdateData) toTarget:self withObject:nil];
}

-(void)doUpdateData{
 NSLog(@"Update data Thread (in 5 sec.)");
 [NSThread sleepForTimeInterval:5];

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 DataManager *data = [[DataManager alloc] initWithContext:managedObjectContext];
 [data updateData];
 [data release];
 data=nil;

 [self performSelectorOnMainThread:@selector(finishUpdateData) withObject:nil waitUntilDone:NO]; 
 [pool release];
}

-(void)finishUpdateData{
 self.navigationItem.leftBarButtonItem = …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data objective-c nsmanagedobjectcontext

1
推荐指数
1
解决办法
4635
查看次数

如何将受管对象上下文分配给iOS中的应用程序委托?

Model.xcdatamodeld用一个实体创建了一个iOS项目和一个托管对象模型().在application:didFinishLaunchingWithOptions:我想测试托管对象模型是否存在,但是我得到了nil.在创建托管对象模型后,是否必须执行一些特殊操作才能创建托管对象上下文?

关于我可能做错的任何建议?

这是界面

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{

}

@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end
Run Code Online (Sandbox Code Playgroud)

这是实现文件

#import "AppDelegate.h"
#import "RootViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize navigationController = _navigationController;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (![self managedObjectContext]) 
    {
        NSLog(@"Does not exist");
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobjectcontext ios

1
推荐指数
1
解决办法
2823
查看次数

CoreData/RegEx错误:无法从对象创建正则表达式

我似乎得到了一个我无法理解的错误.希望这不会太混乱和冗长,但由于我似乎无法在我的搜索中找到任何答案,我认为这可能是必要的.在我的程序中,我有几个实体:

ItemSold发票客户

Customer可以有很多Invoices,Invoices可以有很多ItemSolds.

在我的Interface Builder中,我有三个表.一个表代表客户,另一个代表发票,最后一个代表发票中的项目.因此,当您选择客户时,他们的发票会显示在发票表中.单击发票后,该发票上的项目将显示在最后一个表格中.

当我在桌子上选择时,我似乎得到了错误.有趣的是,在另一种观点中,我可以做得很好(当我尝试根据他们与Type的关系对Items进行排序时).但是我无法在这里工作.这是我获取应该存储的项目:

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(HistoryController *)[[NSApplication sharedApplication] delegate] managedObjectContext]; 
}
NSError *error = nil;

// fetch all customers
NSFetchRequest *fetchRequest2 = [[NSFetchRequest alloc] init];
NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Customer"
                                           inManagedObjectContext:managedObjectContext];
[fetchRequest2 setEntity:entity2];
fetchedCustomers = [managedObjectContext executeFetchRequest:fetchRequest2 error:&error];
if (fetchedCustomers == nil) {
    NSLog(@"ERROR");
}
[fetchRequest2 release];
// end of customer fetch

// fetch all invoices
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nstableview nspredicate nsmanagedobjectcontext

1
推荐指数
1
解决办法
2239
查看次数

iOS - 核心数据 - NSManagedObjectContext - 不确定它是否已保存

概观

  • 我有一个iOS项目,我在其中使用Core数据
  • 我正在插入一个对象,然后我想保存它.
  • 我不确定保存是否有效.
  • 当应用程序进入后台时,保存似乎正在工作
  • 使用模拟器时,如果单击Xco​​de上的"停止"按钮,则保存似乎不起作用.

  1. 保存真的发生了吗?
  2. 我是否面临问题,因为我创建了一个基于视图的应用程序(核心数据复选框不可用)?

接下来的步骤

  • 我正在使用模拟器进行测试.
  • 插入一个对象(代码在下一节)
  • 保存插入的对象(代码在下一节中)
  • 我按下Xcode上的停止按钮以停止运行应用程序

输出注意到了

setBeforeSave.count = 1
setAfterSave.count = 0
Run Code Online (Sandbox Code Playgroud)
  • 保存之前,该NSManagedObjectContext方法insertedObjects返回1个对象
  • 保存之前,该NSManagedObjectContext方法insertedObjects返回0个对象
  • 当按下Xcode停止按钮,并且重新启动应用程序时,之前的数据不可用(是因为我点击了xcode上的停止)
  • managedObjectContext不是零
  • NSManagedObjectContext方法save:返回YES.

插入对象的代码

Test *test = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.database.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

保存代码:

//database is a property of the type UIManagedDocument

NSSet *setBeforeSave = [self.database.managedObjectContext insertedObjects];
NSLog(@"setBeforeSave.count = %i", setBeforeSave.count);

NSError *error = nil;

if(![self.database.managedObjectContext save:&error])
    NSLog(@"error = %@", error);    

NSSet *setAfterSave = [self.database.managedObjectContext insertedObjects]; …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobjectcontext ios

1
推荐指数
1
解决办法
3072
查看次数

NSManagedObjectContext的mergeChangesFromContextDidSaveNotification:post NSManagedObjectContextDidSaveNotification?

我有一堆NSOperations和他们自己的NSManagedObjectContexts对我的Core Data存储进行了更改并保存并成功地将他们的更改变为主线程的NSManagedObjectContext.我知道这个.现在我希望在主要上下文更新时通知前UIViewController.所以我...

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(refreshData:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:[NSManagedObject mainThreadManagedObjectContext]];
}
Run Code Online (Sandbox Code Playgroud)

但是,我不认为在合并后台线程的更改后,主线程的NSManagedObjectContext会发布自己的任何通知.我试图在文档中的哪个地方找到Apple说我应该在告诉主要线程合并更改或其他一些之后发布我自己,但没有运气.为了在我的NSOperation中额外参考,我有......

+ (void)mergeChanges:(NSNotification *)notification
{
    NSManagedObjectContext *managedObjectContext = [self mainThreadManagedObjectContext];

    [managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                           withObject:notification
                                        waitUntilDone:YES];
}

+ (NSManagedObjectContext *)adHocManagedObjectContext
{
    NSManagedObjectContext *adHocManagedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(mergeChanges:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:adHocManagedObjectContext];

    return adHocManagedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)

我是否希望听到主线程的NSManagedObjectContext有关它的保存,或者我应该在mergeChangesFromContextDidSaveNotification后发布我自己的通知:?

core-data objective-c nsmanagedobjectcontext

1
推荐指数
1
解决办法
2156
查看次数

访问ManagedObjectContext

我正在将Core Data集成到一个不是使用Core Data模板创建的应用程序中.我遇到了这方面的问题,可能有一个非常简单的答案.但是,由于大多数关于这个主题的教程都是针对使用模板的,所以我很难过.

我已经按照建议创建了一个选中Core Data的简单应用程序,并将生成的代码复制到我现有的应用程序中.但是,我无法弄清楚如何访问AppDelegate之外的NSManagedObjectContext.我有几个视图控制器,我需要访问托管对象上下文.

我复制到应用程序中的生成代码放在AppDelegate中,以及.pch文件中对CoreData的引用.我错过了什么吗?如何访问托管对象上下文?

谢谢!V

core-data objective-c nsmanagedobjectcontext ios

1
推荐指数
1
解决办法
3526
查看次数