我在我的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) 有人可以帮我定义一个谓词,只返回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) 最近几个小时我一直在拉我的头发试图弄清楚为什么insertNewObjectForEntityForName要回来,NSManagedObject即使我正在尝试插入我自己类型的实体.
我检查了一千次的事情:
可能发生这种情况的原因是什么?我不知道从这里看哪里,谷歌没有多大帮助:(
编辑(已解决):
这与版本控制有关...我删除了数据模型并再次重新创建它,一切都开始工作,之前有一些以前使用过的版本... 叹息有时会问一个问题,想一想如何找到一个解
我仍然对为什么会发生这种情况感到困惑,尽管它现在已经解决了
我在我的应用程序中的一个模型上实现了如下的瞬态属性.它在模型设计中声明为具有未定义类型的瞬态属性.
@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在文件的顶部,似乎没有任何帮助.在不生成这些警告的情况下,我需要做什么才能使用推荐的动态访问器?
任何帮助非常感谢.
我有两个实体,它们之间有一对多的关系.保存"many"的实体具有预期的NSSet属性.我不确定如何访问NSSet中的特定元素.NSSet包含具有多个属性的对象,其中一个属性是currentWeek.我想访问我的NSSet中具有特定currentWeek的对象.
我知道我可以做一个FetchRequest来找到它,但我认为使用NSSet有一种更简单的方法.
我想了解更多核心数据,为什么我们"获取"并搜索实体而实体是"内部"托管对象?例如 :
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文件中的一个数据?
谢谢你的回答
保罗
NSManagedObject提供访问它NSManagedObjectContext,但它保留它吗?
根据Marcus Zarra的 " 在iOS上传递NSManagedObjectContext"," 内部NSManagedObject保留了对它的引用NSManagedObjectContext,我们可以访问它."
Zarra如何知道这一点并且他是否正确?
我问,因为我想知道是否NSManagedObjectContext会dealloc在tearDown下面的方法中编辑.(我正在使用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) 在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
我正在寻找一种方法来跟踪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)
如果对象发生更改,则会记录该对象的新属性.如何获得获取旧属性值的方法?
我正在创建一个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 ...我应该怎么做?可以手动完成吗?因为我是从实体模型生成的,所以我觉得我需要创建一个新的实体才能做到这一点......?
如果你可以指导我,也许通过解释它是如何工作的那将是很棒的..可能我不明白这里的东西,这就是我问这个问题的原因
nsmanagedobject ×10
core-data ×9
ios ×4
iphone ×3
objective-c ×2
entities ×1
entity ×1
nspredicate ×1
nsset ×1
nsstring ×1
retain ×1
xcode ×1