标签: nsmanagedobject

CoreData:NSManagedObject不响应用户定义的消息

使用CoreData(在iPhone应用程序上)我从模型中生成了我的实体类,并为某些类添加了更多方法.似乎有时我会因为调用其中一种方法而获得异常.异常不是随机的,只涉及一些ManagedObject子类(其他人似乎正确响应).这是我得到的一个例子:

-[NSManagedObject printTime]: unrecognized selector sent to instance 0x5b50af0
Run Code Online (Sandbox Code Playgroud)

2010-07-15 10:29:55.216 LP [6686:207]***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [NSManagedObject printTime]:无法识别的选择器发送到实例0x5b50af0'

NSManagedObject是我从fetch获取的对象(转换为正确的子类),我所讨论的方法是打印方法.(我试图检索那些不是故障)我错过了什么?

iphone core-data nsexception nsmanagedobject

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

在Core Data中存储负整数

我可以正确地为管理对象模型实例的属性分配和检索正整数.但是,为此属性分配负整数会将数字"4294967295"记录到我的核心数据持久性存储(xml文件).因此,当应用程序重新加载并重新实例化托管对象时,该属性显示为"4294967295".

此属性在我的DataModel中指定为Integer 32类型,其"Min Value"为"-12".我猜这与将负整数存储为字符串有关.此代码生成相同的"4294967295":

NSLog(@"Log -1: %u", -1);
=> "Log -1: 4294967295"
Run Code Online (Sandbox Code Playgroud)

在Core Data中存储负整数的正确方法是什么?

core-data objective-c nsmanagedobject

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

找不到实体的NSManagedObjectModel

这是viewDidLoad中fetchRequest的代码,代码遵循这里的教程,只是我以编程方式链接导航控制器和tableview,而不是使用界面构建器.实体ProductInfo存在.但是,当我运行程序时,我收到错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'ProductInfo''
Run Code Online (Sandbox Code Playgroud)

我已经重置模拟器,因为它是一个旧模型,但错误仍然发生.我也切换到使用FetchedResultsController,但问题仍然存在.问题是因为这些fetchedResultsController方法不在appdelegate中?它们目前位于TableViewController中.我怎么解决这个问题?

viewDidLoad方法:

- (void)viewDidLoad{

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"ProductInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError * error;
self.productInfos = [_context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
[super viewDidLoad];}
Run Code Online (Sandbox Code Playgroud)

ProductInfo.h:

@class ProductDetails;

@interface ProductInfo : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * productName;
@property (nonatomic, retain) NSString * productPrice;
@property (nonatomic, retain) …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsmanagedobject ios

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

在CoreData中保存NSManagedObjectID

我有一个xcdatamodel,其中包含一组内置在静态库中的实体.

我在项目中包含了这个静态库.我想在主项目中创建另一个模型,实体名为Task.我想在实体中有一个属性,我可以在其中存储NSManagedObjectID在静态库中创建的实体.随着NSManagedObjectID我可以很容易地获取主存储和获取的实体.最后,可能有许多任务实体引用objectID.

可能吗 ?我也明白这听起来像一个关系模型,核心数据不是,所以有更好的解决方案来处理这个主题吗?

谢谢

core-data objective-c nsmanagedobject

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

在后台获取Core Data对象:对象没有出现故障

我需要一些帮助来使用Core Data with GCD中的对象; 我似乎得到NSManagedObjects,即使我访问他们的属性,也没有出现在主线程中.会感激一些帮助.

这就是我正在做的事情:在启动时,我需要从Core Data DB加载一个Person列表,在后台进行一些自定义处理,然后重新加载表以显示名称.我通过仅将objectID传递到GCD队列来遵循Core Data多线程的指导原则.但是当我在主线程上重新加载tableview时,我从未看到为联系人显示的名称(或其他属性),并且仔细观察,NSManagedObjects结果是主线程上的错误,即使我访问了各种属性的cellForRowAtIndexPath.当我NSLog时,name属性在后台线程中可见; 它也在cellForRowAtIndexPath中的NSLogs主线程上正确显示.但无论我做什么,它们都不会在tableView中显示.我尝试使用点表示法访问name属性,以及valueForKey,但都没有工作.

这是我的代码...... 它是从FRC初始化程序调用的:

- (NSFetchedResultsController *)fetchedResultsController 
{
    if (__fetchedResultsController != nil) 
    {
        return __fetchedResultsController;
    }

    __fetchedResultsController = [self newFetchedResultsControllerWithSearch:nil]; // creates a new FRC

    [self filterAllContactsIntoDictionary: __fetchedResultsController];
    return [[__fetchedResultsController retain] autorelease];
}  


- (void) filterAllContactsIntoDictionary: (NSFetchedResultsController *) frc
{

    NSArray *fetchedIDs = [[frc fetchedObjects] valueForKey:@"objectID"];
    NSArray *fetched = [frc fetchedObjects];

    if (filterMainQueue == nil) {
        filterMainQueue = dispatch_queue_create("com.queue.FilterMainQueue", NULL);
    }
    dispatch_async(self.filterMainQueue, ^{

        NSManagedObjectContext *backgroundContext = [[[NSManagedObjectContext alloc] init] autorelease];
        [backgroundContext setPersistentStoreCoordinator:[[self.fetchedResultsController …
Run Code Online (Sandbox Code Playgroud)

core-data grand-central-dispatch nsmanagedobject nsmanagedobjectcontext ios

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

避免在核心数据提取上出现重复结果

我有一个CoreDataTableViewController的子类(由斯坦福大学的人做的UITAbleViewController圆的子类,用于链接CoreData和TableViews).在这个类上,我想执行一个fecth,通过一个名为"definition"的属性进行排序,执行它的代码如下:

- (void)setupFetchedResultsController{


    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:self.entity];

    request.propertiesToFetch=[NSArray arrayWithObject:@"definition"];
    request.returnsDistinctResults=YES;

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"%K != nil", @"definition"]; 
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K != ''", @"definition"];
    NSPredicate *predicate3=  [NSPredicate predicateWithFormat:@"%K contains[cd] %@", @"definition", self.seachBar.text];

    NSArray *prepredicateArray;

    if ([self.seachBar.text length]) {
         prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2, predicate3,nil];

    }else {
         prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2,nil];

    }

    request.predicate=[NSCompoundPredicate andPredicateWithSubpredicates:prepredicateArray];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"definition" ascending:YES ]];





    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];




    [self performFetch];


}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,请设置request.returnsDistinctResults = YES; 应避免重复获取.但它不起作用,我看到这个属性值的重复.

那里有什么我想念的吗?我很欣赏那里的一些指点.先感谢您. …

xcode core-data nspredicate nsfetchrequest nsmanagedobject

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

NSManagedObject的单元测试[GHUnit]

我是Java开发人员,我曾经将我的Java实体测试为POJO.现在,使用Obj-C,我想对从NSManagedObject继承的实体做同样的事情(我使用CoreData作为持久性).

例如,我想测试我的Customer实体:

-(void)myTest {
Customer *customer = [Customer alloc] init];
customer.name = @"toto";
GHAssertEqualStrings(customer.name, @"toto", @"");
}
Run Code Online (Sandbox Code Playgroud)

但我遇到的错误是:

NSInvalidArgumentException原因: - [Customers setName:]:发送到实例的无法识别的选择器...

所以我已经使用适当的数据库模式url加载了setUp中的所有NSManagedObjectContext.现在我实例化我的客户,它的工作原理:

Customers *customer = [NSEntityDescription
insertNewObjectForEntityForName:kDataBaseCustomerKey inManagedObjectContext:ctx];
Run Code Online (Sandbox Code Playgroud)

但这是测试'POJO'的合适方式吗?我想在没有任何模型加载的情况下测试我的Customer类,因为在这种情况下我不关心datamodel.

谢谢你的建议.

问候.

unit-testing nsmanagedobject gh-unit ios

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

通过segue从UITableViewCell填充DetailController

我正在填充一个UITableViewfrom中的单元格,CoreData我有一个关于如何最好地将我需要的数据传输给我的问题DetailController(即viewController,当单元格被点击时显示的数据).

目前在填充UITableViewCells时,我使用indexPath传递给单元格managedObject从Core Data中检索适当的.在这个阶段,我只用托管对象的一些信息更新单元格(即名称,年龄,性别).

UITableView完全填充后,我想让用户选择一个UITableViewCellDetailController显示更深入的信息(即姓名,年龄,性别,职业,体重,身高等).当点击单元格时,我正在使用-prepareForSegue过渡到新呈现的DetailController.

我的问题:

segue的"发送者"是UITableViewCell(子类),但我只用最初在较小的单元格中显示的信息填充了它.我是不是该

  1. 将更多iVar添加到UITableViewCell子类并存储我需要的所有数据,
  2. 将指针iVar保留在模型的单元格上 managedObject
  3. 我可能错过的其他东西?

iphone cocoa-touch objective-c uitableview nsmanagedobject

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

CoreData:创建临时模型并保存到上下文

我有Core Data的问题,因为我不知道处理问题的最佳方法:

我从服务器加载一个json并在ManagedObjects中解析结果.起初,ManagedObjects应该是临时的.但是用户可以将ManagedObject放到传单中.然后ManagedObject应保存到CoreData.(该对象应该可以脱机访问)当用户稍后从服务器加载相同的对象时,应该获取已保存的ManagedObjects.

所以我不想把用户不需要的CoreData/PersistantStore中的每个对象都放在一起.

首先我要做的是创建一个背景上下文:

__block NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = context;
Run Code Online (Sandbox Code Playgroud)

使用fetch,我检查persistantstore中是否已存在ManagedObject.如果有的话,我会接受这个.否则在nil上下文中创建一个新的ManagedObject.

NSArray *results = [backgroundContext executeFetchRequest:fetch error:&error];

if (!error && results.count == 1) {
    myModel = [results objectAtIndex:0];
}
else {
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" inManagedObjectContext:backgroundContext];
    myModel = (MyModel *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
}
Run Code Online (Sandbox Code Playgroud)

我对每一段关系都这样做:

if (! myModel.relation) {
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Relation" inManagedObjectContext:backgroundContext];
    myModel.relation = (Relation *)[[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:myModel.managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)

通过创建模型到目前为止工作正常.但如何保存一个模型?

managedObjectContext为nil.如果我在managedObjectContext上调用save:它会保存所有内容.

在我的AppDelegate中,我写了一个函数来在主ManagedObjectContext中插入一个ManagedObject:

- …
Run Code Online (Sandbox Code Playgroud)

core-data temporary nsmanagedobject nsmanagedobjectcontext ios

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

如何在获取之前更改托管对象类名称

我有一个使用CoreData的Swift应用程序.我List用class 创建了实体MyAppTarget.List.在.xcdatamodeld文件中正确配置了所有内容.为了从持久存储中获取我的实体,我正在使用NSFetchedResultsController:

let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName("List", inManagedObjectContext: managedObjectContext)
fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "name", ascending: true) ]
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: "ListFetchedResultsControllerCache")
Run Code Online (Sandbox Code Playgroud)

并且它像预期的那样工作,MyAppTarget.List在获取时返回对象数组.

但是,我想在另一个目标中使用它进行单元测试.我添加了ListMyUnitTestTarget,所以我可以在单元测试目标中访问它.问题是获取的结果控制器返回MyAppTarget.List对象,而不是MyUnitTestTarget.List对象.为了使List实体可测试,我必须公开它以及我需要使用的所有方法,我想避免这种情况.

我试图更改managedObjectClassName属性NSEntityDescription:

fetchRequest.entity.managedObjectClassName = "MyUnitTestTarget.List"
Run Code Online (Sandbox Code Playgroud)

但它会产生异常:

失败:捕获"NSInternalInconsistencyException","无法修改不可变模型".

文件指出,

[...]一旦使用了描述(当它所属的托管对象模型与持久性存储协调器相关联时),它就不能(实际上不能)被更改.[...]如果需要修改正在使用的模型,请创建副本,修改副本,然后使用旧模型丢弃对象.

不幸的是,我不知道如何实现这个流程.我想知道在获取实体之前是否有办法在运行时更改托管对象类名NSFetchedResultsController

core-data nsfetchedresultscontroller nsfetchrequest nsmanagedobject swift

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