标签: nsmanagedobjectcontext

NSManagedObject是否保留其NSManagedObjectContext?

NSManagedObject提供访问它NSManagedObjectContext,但它保留它吗?

根据Marcus Zarra的 " 在iOS上传递NSManagedObjectContext"," 内部NSManagedObject保留了对它的引用NSManagedObjectContext,我们可以访问它."

Zarra如何知道这一点并且他是否正确?

我问,因为我想知道是否NSManagedObjectContextdealloctearDown下面的方法中编辑.(我正在使用CocoaPlant.)

#import <SenTestingKit/SenTestingKit.h>
#import <CocoaPlant/CocoaPlant.h>

#import "AccountUser.h"

@interface AccountUserTests : SenTestCase {
    AccountUser *accountUser;
}
@end

@implementation AccountUserTests

- (void)setUp {
    accountUser = [AccountUser insertIntoManagedObjectContext:
                   [NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType error:NULL]];
}

- (void)tearDown {
    [accountUser delete];
}

- (void)testFetchWithLinkedAccountUserID {    
    // Tests go here...
}

@end
Run Code Online (Sandbox Code Playgroud)

core-data retain nsmanagedobject nsmanagedobjectcontext

4
推荐指数
2
解决办法
1760
查看次数

使用CoreData执行乘法(聚合):如何?

Jeff Lamarche的精彩教程之后,我正在尝试聚合特定子类的数据NSManagedObject.

这就是场景.我创建了一个名为Product扩展NSManagedObject类的类.Productclass有三个属性,如下所示:

@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* quantity;
@property (nonatomic, retain) NSNumber* price;
Run Code Online (Sandbox Code Playgroud)

我还创建了一个名为的类别,Product+Aggregate我执行总和聚合.特别是,按照Jeff教程,我管理了数量属性的总和.

+(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context
{
    NSString* className = NSStringFromClass([self class]);

    NSExpression *ex = [NSExpression expressionForFunction:function 
        arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]];

    NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
    [ed setName:@"result"];
    [ed setExpression:ex];
    [ed setExpressionResultType:NSInteger64AttributeType];

    NSArray *properties = [NSArray arrayWithObject:ed];
    [ed release];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest nsmanagedobject nsmanagedobjectcontext ios

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

CoreData子上下文,NSFetchedResultsController和主线程

在Olivier Drobnik的这篇优秀文章之后,我实现了CoreData大师Marcus S. Zarra提出的三层CoreData堆栈:

三层CoreData上下文架构

与此图和我的代码的唯一区别是我只使用一个临时背景MOC,以避免在几个临时MOC中插入对象时出现重复.这是我的上下文初始化代码:

#pragma mark - NSManagedObjectContexts

+ (NSManagedObjectContext *)privateManagedObjectContext
{
    if (!_privateManagedObjectContext) {

        // Setup MOC attached to PSC
        _privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_privateManagedObjectContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];

        // Add notification to perform save when the child is updated
        _privateContextSaveObserver =
        [[NSNotificationCenter defaultCenter]
         addObserverForName:NSManagedObjectContextDidSaveNotification
         object:nil
         queue:nil
         usingBlock:^(NSNotification *note) {
             NSManagedObjectContext *savedContext = [note object];
             if (savedContext.parentContext == _privateManagedObjectContext) {
                 [_privateManagedObjectContext performBlock:^{
                     NSLog(@"AMBCoreData -> saving privateMOC");
                     NSError *error;
                     if (![_privateManagedObjectContext save:&error]) {
                         NSLog(@"AMBCoreData -> error …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data objective-c nsmanagedobjectcontext ios

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

+ entityForName:nil不是搜索实体名称的合法NSManagedObjectContext参数

我正在尝试做的事情:首次将NSFetchedResultsController用于将UITableView连接到Core Data.我是一个新手,真的没有经验,我跟随Ray Wenderlich的教程一字不差.

错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Medicine''`.
Run Code Online (Sandbox Code Playgroud)

我尝试了什么:我发现的其他StackOverflow问题(包括 这个这个)都没有解释,除了第二个有意义的问题.但是,他提到的方法已经写在我的app委托中,我在我正在使用的TableViewController类中导入.

我非常感激:解释我正在做什么/出了什么问题以及如何解决它,而不仅仅是答案/纠正.

PMMedicinesTableViewController.m

#import "PMMedicinesTableViewController.h"
#import "PMAppDelegate.h"
#import "Medicine.h"

@interface PMMedicinesTableViewController ()

@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end


@implementation PMMedicinesTableViewController

@synthesize fetchedResultsController = _fetchedResultsController;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    } …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c uitableview nsfetchedresultscontroller nsmanagedobjectcontext

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

任何人都可以给我一些参考 NSManagedObjectContext 中的这个方法“refreshAllObjects”

[managedObjectContext refreshAllObjects]
Run Code Online (Sandbox Code Playgroud)

实际上,我在保存上下文期间的某个时候遇到随机错误,当我[managedObjectContext refreshAllObjects]在错误后调用时,它允许我保存。
任何人都可以请指导我这种方法。

nsmanagedobject nsmanagedobjectcontext ios

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

CoreData 合并冲突显示托管对象版本更改而非数据

我在核心数据中有一个实体,我尝试从两个不同的上下文更新它。我正在存储我需要更新的托管对象的 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

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

删除所有核心数据记录,未在 ManagedContext 中设置 hasChanges

我是 coreData 的新手,我有一个问题:

我的应用程序执行以下 3 个连续的核心数据函数:

    let managedContext = persistentContainer.viewContext
    deleteAllCDRecords(managedContext: managedContext, in: "CDShoppingItem")
    saveManagedContext(managedContext: managedContext)  
Run Code Online (Sandbox Code Playgroud)

它们定义(缩写)为:

private func deleteAllCDRecords(managedContext: NSManagedObjectContext, in entity: String) {
    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
    do {
        try managedContext.execute(deleteRequest)
    } catch let error as NSError {
        // error handling
    }
} // deleteAllCDRecords  
Run Code Online (Sandbox Code Playgroud)

private func saveManagedContext(managedContext: NSManagedObjectContext) {
    if !managedContext.hasChanges { return }
    do {
        try managedContext.save()
    } catch let error as NSError {
        // error handling
    }
} …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobjectcontext ios

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

核心数据保存到数据库不工作

我是iPhone的第一次Core Data用户/学习者,我认为这[managedObjectContext save:$error]用于保存对Persistant Store的更改.

但是当我重新加载并调用NSFetch时,对象仍然存在.有什么想法吗?

for (int i ; i < [mutableFetchResults count];i++)
{
    NSManagedObject *toDelete = [mutableFetchResults objectAtIndex:i];
    [managedObjectContext toDelete];

    // Update the array and table view.
    [mutableFetchResults removeObjectAtIndex:i];
}


if (![managedObjectContext save:&error]) {
    // Handle the error.
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    exit(-1);  // Fail
}
Run Code Online (Sandbox Code Playgroud)

iphone core-data nsmanagedobject nsmanagedobjectcontext

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

[controllerWillChangeContent:]:发送到解除分配实例的消息

我的ipad应用程序出了问题.

我有一个可以通过两种方式访问​​的视图,如果我以一种方式进行完美的工作.如果我通过另一个进入,它会在保存上下文时崩溃.

我怀疑它是父母的东西(客户的订单) - 我得到一个带有消息的僵尸:

[OrdersByCustomer controllerWillChangeContent:]:当我通过Zombies intstruments运行它时,发送到解除分配的实例0x10102020的消息:

#   Category    Event Type  RefCt   Timestamp   Address Size    Responsible     Library Responsible Caller
0   OrdersByCustomer    Malloc  1   00:35.545.273   0x89cafc0   272 Dentanet    -[CustomersRootController tableView:didSelectRowAtIndexPath:]
1   OrdersByCustomer    Retain  2   00:35.545.357   0x89cafc0   0   Dentanet    -[CustomersRootController tableView:didSelectRowAtIndexPath:]
2   OrdersByCustomer    Retain  3   00:35.545.414   0x89cafc0   0   UIKit   -[UISplitViewController setViewControllers:]
3   OrdersByCustomer    Release 2   00:35.545.434   0x89cafc0   0   UIKit   -[UISplitViewController setViewControllers:]
4   OrdersByCustomer    Retain  3   00:35.546.380   0x89cafc0   0   UIKit   -[UINib instantiateWithOwner:options:]
5   OrdersByCustomer    Retain  4   00:35.546.406   0x89cafc0   0   UIKit   -[UINib instantiateWithOwner:options:] …
Run Code Online (Sandbox Code Playgroud)

memory-management nsfetchedresultscontroller ipad nsmanagedobjectcontext xcode4

3
推荐指数
2
解决办法
2369
查看次数

Swift中的核心数据

尝试在Swift中使用Core Data.找到这个例子:

http://www.sep.com/sep-blog/2014/06/23/ac-developer-learns-swift-part-1-core-data/

创建了具有两个字符串字段的实体" Person " - lastnamefirstname.创建UITableViewController(MainTableViewController)以在屏幕上显示记录.创建UIViewController(DetailViewController)以添加新记录.为实体数据创建了我自己的类(AddrBook).

不起作用显示主类中实体中包含的记录 - MainTableViewController.

我的类AddrBook.swift:

import UIKit
import CoreData

@objc(AddrBook)
class AddrBook: NSManagedObject {

@NSManaged var lastname:String
@NSManaged var firstname:String
}
Run Code Online (Sandbox Code Playgroud)

UIViewController添加新记录.DetailViewController.swift:

import UIKit
import CoreData

class DetailViewController: UIViewController {

@IBOutlet var lastNameField : UITextField = nil
@IBOutlet var firstNameField : UITextField = nil

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder) …
Run Code Online (Sandbox Code Playgroud)

core-data nsarray nsmanagedobjectcontext swift ios8

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