标签: nsmanagedobject

将NSManagedObject的实例添加到NSManagedObjectContext ok,更新同一实例失败

我在我的iPhone应用程序中使用核心数据.我创建了一个简单的类Friend,它派生自NSManagedObject并使用以下属性:

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

我能够在我的上下文中添加和删除此类的实例,并且我的更改也是持久的.
现在我想更新/修改一个Friend -instance并让它再次持久化.

但这似乎不起作用.

这是一段显示我的问题的代码:

//  NSManagedObjectContext *context  = < my managed context> 
//   NSFetchedResultsController *nsfrc= < my fetched result controller>

NSEntityDescription *entity = [nsfrc entity];
NSManagedObject *newManagedObject = [NSEntityDescription 
       insertNewObjectForEntityForName:[entity name]  inManagedObjectContext:context];

Friend *f = (Friend *) newManagedObject;
f.name = @"name1";
//1.  --- here context.hasChanges == 1 ---   ok

NSError *error = nil;
if (![context save:&error]) { ... }
//2.  --- here context.hasChanges == 0 --- …
Run Code Online (Sandbox Code Playgroud)

iphone core-data nsmanagedobject nsmanagedobjectcontext

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

NSPredicate NSManagedObject的字符串属性的长度

有人可以帮我定义一个谓词,只返回NSManagedObject的"字母"属性长度在一定范围内吗?

这是我一直在尝试的例子,我感觉这是字母.长度表示法,我也尝试过kvc字母.@长度没有成功..我做错了什么?

NSManagedObjectContext *context = ...;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"letters" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"letters.length BETWEEN %@", [NSArray arrayWithObjects: [NSNumber numberWithInt:5], [NSNumber numberWithInt:20], nil]];
[fetchRequest setPredicate:predicate];

NSUInteger limit = 20;
[fetchRequest setFetchLimit:limit];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
Run Code Online (Sandbox Code Playgroud)

core-data nsstring nspredicate nsmanagedobject

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

insertNewObjectForEntityForName返回错误的类型

最近几个小时我一直在拉我的头发试图弄清楚为什么insertNewObjectForEntityForName要回来,NSManagedObject即使我正在尝试插入我自己类型的实体.

我检查了一千次的事情:

  • 类名称在图表设计器中设置为正确的值
  • 实体与另一个实体有多对多关系,创建其他实体按预期工作,我确实得到了正确输入的输出,我发誓它们是相同的

可能发生这种情况的原因是什么?我不知道从这里看哪里,谷歌没有多大帮助:(

编辑(已解决):

这与版本控制有关...我删除了数据模型并再次重新创建它,一切都开始工作,之前有一些以前使用过的版本... 叹息有时会问一个问题,想一想如何找到一个解

我仍然对为什么会发生这种情况感到困惑,尽管它现在已经解决了

iphone xcode entity core-data nsmanagedobject

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

无法摆脱瞬态属性getter impls中的primitiveValue访问器的编译器警告

我在我的应用程序中的一个模型上实现了如下的瞬态属性.它在模型设计中声明为具有未定义类型的瞬态属性.

@property (nonatomic, readonly) NSNumberFormatter *currencyFmt;
Run Code Online (Sandbox Code Playgroud)

此访问器的当前(无警告)impl是:

- (NSNumberFormatter *) currencyFmt
{
    [self willAccessValueForKey:@"currencyFmt"];
    NSNumberFormatter *fmt = [self primitiveValueForKey:@"currencyFmt"];
    [self didAccessValueForKey:@"currencyFmt"];

    if (fmt == nil)
    {
        fmt = [[[NSNumberFormatter alloc] init] autorelease];
        [fmt setNumberStyle:NSNumberFormatterCurrencyStyle];
        [fmt setLocale:[self localeObject]];
        [self setPrimitiveValue:fmt forKey:@"currencyFmt"];
    }

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

调用primitiveValueForKey:是这里的问题,因为文档特别警告不要使用这个版本的原语查找:

强烈建议您使用动态生成的访问器而不是直接使用此方法(例如,primitiveName:而不是primitiveValueForKey:@"name").动态访问器更高效,并允许编译时检查.

问题是,如果我尝试使用primitiveCurrencyFmt而不是primitiveValueForKey:@"currencyFmt",我得到一个编译器警告说该对象可能不响应该选择器.如果我只是忽略这个警告,那么在运行时一切正常,但是警告很糟糕,而且我不想提交任何包含它们的代码.

我试着声明属性与@dynamic@synthesize在文件的顶部,似乎没有任何帮助.在不生成这些警告的情况下,我需要做什么才能使用推荐的动态访问器?

任何帮助非常感谢.

iphone core-data objective-c nsmanagedobject

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

从NSSet检索NSManagedObject

我有两个实体,它们之间有一对多的关系.保存"many"的实体具有预期的NSSet属性.我不确定如何访问NSSet中的特定元素.NSSet包含具有多个属性的对象,其中一个属性是currentWeek.我想访问我的NSSet中具有特定currentWeek的对象.

我知道我可以做一个FetchRequest来找到它,但我认为使用NSSet有一种更简单的方法.

nsset nsmanagedobject ios

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

核心数据:托管对象和实体之间的差异?

我想了解更多核心数据,为什么我们"获取"并搜索实体而实体是"内部"托管对象?例如 :

NSManagedObjectContext *moc = [self managedObjectContext];  
NSEntityDescription *entityDescription =
    [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];  
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];  
[request setEntity:entityDescription];
Run Code Online (Sandbox Code Playgroud)

另外,持久对象存储包含什么?如果我理解,持久对象存储从sqlite文件中获取数据,但后来有点困惑,是:一个实体,对于一个持久对象存储,对于sqlite文件中的一个数据?

谢谢你的回答

保罗

entities core-data nsmanagedobject

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

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
查看次数

跟踪NSManagedObject的属性更改

我正在寻找一种方法来跟踪NSManagedObject的属性更改.

目前我使用NSNotifactionCenter来查看我的managedobjectcontext的更改:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDataModelChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

它会触发handleDataModelChange Methode,如下所示:

- (void)handleDataModelChange:(NSNotification *)note
{
    NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];

    if (updatedObjects.count > 0) {
        for (NSManagedObject *obj in updatedObjects.allObjects) {
            NSLog(@"Object updated: %@ with values:",obj.entity.name);
            NSDictionary *theAttributes = [self getAllAttributesOf:obj];
            for (NSString *attributeName in theAttributes) {
                NSLog(@"Name: %@ : %@",attributeName,[obj valueForKey:attributeName]);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果对象发生更改,则会记录该对象的新属性.如何获得获取旧属性值的方法?

core-data nsmanagedobject nsmanagedobjectcontext ios

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

如何将属性添加到使用数据模型创建的核心数据类?

我正在创建一个todo应用程序:

我在我的项目.datamodel文件中创建了一个实体,我在实体中添加了一个名为"content"的字符串的属性,并使用"editor">"Create NSManagedObject subclass"创建了NSManagedObject子类:

在此输入图像描述

这个类是创建的:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Targets : NSManagedObject

@property (nonatomic, retain) NSString * content;

@end
Run Code Online (Sandbox Code Playgroud)

但现在我想要另一个"id"属性,我可以给每个todo一个id ...我应该怎么做?可以手动完成吗?因为我是从实体模型生成的,所以我觉得我需要创建一个新的实体才能做到这一点......?

如果你可以指导我,也许通过解释它是如何工作的那将是很棒的..可能我不明白这里的东西,这就是我问这个问题的原因

core-data objective-c nsmanagedobject ios

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