标签: core-data

NSPredicate对多对多关系不区分大小写的匹配

我正在实现一个搜索字段,用户可以在其中键入字符串以过滤视图中显示的项目.显示的每个对象都有一个keywords多对多关系,我希望能够根据关键字过滤对象.每个关键字对象都有一个name属性,所以我设置了一个NSPredicate来进行如下所示的过滤:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString];
Run Code Online (Sandbox Code Playgroud)

这有效,但问题是搜索区分大小写,因此如果关键字具有大写字母但用户输入全部小写,则不会找到匹配项.我尝试过以下修改:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString];
Run Code Online (Sandbox Code Playgroud)

但这对匹配的区分大小写没有任何影响.有没有办法只使用普通谓词来进行不区分大小写的匹配?或者我是否需要在关键字类上实现某种自定义访问器,例如编写一个lowercaseName方法并匹配较低版本的搜索字符串?

附录:经过进一步探索后,添加自定义访问器的解决方法适用于手动使用NSPredicate,但在将NSFetchRequest与Core Data一起使用时根本不起作用,这仅在查询Core Data模型中定义的属性时有效.

cocoa core-data objective-c

65
推荐指数
4
解决办法
6万
查看次数

如何实现CoreData记录的重新排序?

我在我的iPhone应用程序中使用CoreData,但CoreData没有提供允许您重新排序记录的自动方式.我想使用另一列来存储订单信息,但使用连续的数字来排序索引有一个问题.如果我处理大量数据,重新排序记录可能涉及更新订单信息上的大量记录(这有点像改变数组元素的顺序)

实施有效订购方案的最佳方法是什么?

core-data ios

64
推荐指数
5
解决办法
2万
查看次数

iPhone核心数据"自动轻量级迁移"

我正在尝试更新实现核心数据存储的应用程序.我正在为其中一个实体添加一个属性.

我将以下代码添加到我的委托类:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

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

这来自以下网址: Doc

执行代码时出现以下错误:

2009-12-01 20:04:22.877

Shoppee [25633:207]错误:错误

Domain = NSCocoaErrorDomain Code = 134130 …

iphone core-data core-data-migration ios

64
推荐指数
5
解决办法
2万
查看次数

核心数据:NSPredicate用于多对多关系.("这里不允许使用多个键")

我有两个名为"Category"和"Article"的实体,它们有很多关系.我想形成一个谓词,搜索category.name等于某个值的所有文章.我有以下内容:

 NSEntityDescription  *entityArticle   = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:managedObjectContext]; 
 NSSortDescriptor  *sortDescriptor   = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
 NSArray     *sortDescriptors  = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
 NSPredicate    *predicate    = [NSPredicate predicateWithFormat:@"categories.name == [cd] %@", category.name]; 

 [request setSortDescriptors:sortDescriptors];
 [request setEntity:entityArticle];
 [request setPredicate:predicate];

 NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];

 if ([results count] > 0)
  NSLog(@"Results found."); 
 else 
  NSLog(@"NO results found."); 

 [request release];
 [sortDescriptor release];
 [sortDescriptors release];
Run Code Online (Sandbox Code Playgroud)

我收到的错误是 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

有没有选择来检索所需的数据?

core-data nspredicate ios

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

Xcode 8为iOS 10生成损坏的NSManagedObject子类

我最近将我的iOS应用程序项目更新到iOS 10.现在我正在尝试更改我的应用程序的核心数据模型,但Xcode生成的新NSManagedObject子类已损坏.我也尝试修复子类手册,但这不起作用.

Core Data Model的最小工具版本设置为Xcode 7.0,代码生成语言设置为Swift.

这是Xcode生成的代码:

import Foundation
import CoreData
import 

extension Group {

    @nonobjc public class func fetchRequest() -> NSFetchRequest {
        return NSFetchRequest(entityName: "Group");
    }

    @NSManaged public var name: String?
    @NSManaged public var platform: NSNumber?
    @NSManaged public var profiles: NSOrderedSet?

}

// MARK: Generated accessors for profiles
extension Group {

    @objc(insertObject:inProfilesAtIndex:)
    @NSManaged public func insertIntoProfiles(_ value: SavedProfile, at idx: Int)

    @objc(removeObjectFromProfilesAtIndex:)
    @NSManaged public func removeFromProfiles(at idx: Int)

    @objc(insertProfiles:atIndexes:)
    @NSManaged public func insertIntoProfiles(_ values: [SavedProfile], at indexes: NSIndexSet)

    @objc(removeProfilesAtIndexes:) …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject ios10 xcode8

63
推荐指数
8
解决办法
4万
查看次数

核心数据多线程应用程序

我正在尝试以多线程方式使用核心数据.我只是想在后台下载新数据时显示以前下载的数据的应用程序.这应该让用户在更新过程中访问应用程序.

我有一个NSURLConnection使用委托异步下载文件(并显示进度),然后我使用XMLParser解析新数据并在单独的上下文中创建新的NSManagedObjects,具有自己的persistentStore并使用单独的线程.

问题是在显示新对象时在旧对象的同一上下文中创建新对象会抛出BAD_INSTRUCTION异常.所以,我决定为新数据使用单独的上下文,但是我无法找到一种方法,一旦完成就将所有对象移动到其他上下文.

Paolo又名SlowTree

iphone multithreading core-data ios

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

有什么方法可以预先填充核心数据?

我一直在创建一个列表应用程序并用核心数据支持它.

我想有一个默认的10个机场项目清单,这样用户就不必从头开始了.

有没有办法做到这一点?

任何帮助表示赞赏.提前致谢.

iphone core-data uitableview persist ios

62
推荐指数
7
解决办法
4万
查看次数

当Apple说NSManagedObjectContext由创建它的线程或队列拥有时,它意味着什么?

似乎在11月,Apple更新了NSManagedObjectContext类参考核心数据编程指南文档,明确地将串行GCD调度队列和NSOperationQueues作为可接受的机制来同步访问NSManagedObjectContext.但他们的建议似乎含糊不清,可能相互矛盾,我想确保我已经理解它.

以前,公认的智慧似乎NSManagedObjectContext只能从创建它的线程访问,并且使用串行队列进行同步是不够的; 虽然串行队列一次只执行一个操作,但这些操作可能会在不同的线程上进行调度,而MOC不喜欢这样.

但是现在,从编程指南,我们有:

您可以使用线程,串行操作队列或调度队列进行并发.为了简明起见,本文始终使用"线程"来指代其中任何一个.

到目前为止,这么好(尽管他们对线程和队列的混淆是无益的).所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对吧?Apple甚至在Core Data WWDC会话中对此进行了直观描述.

但是......你在哪里为队列创建上下文?在NSManagedObjectContext文档中,Apple声明:

[上下文]假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.

所以现在我们有了一个NSManagedObjectContext需要知道它的主人是谁的想法.我假设这意味着要在队列中执行的第一个操作应该创建MOC并保存对它的引用以供剩余的操作使用.

这是正确的吗?我犹豫不决的唯一原因是NSManagedObjectContext文章继续说:

相反,您应该传递对持久性存储协调器的引用,并让接收线程/队列创建从该派生协调器派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.

Apple现在似乎将操作与安排执行的队列混为一谈.这是我的头脑,并让我想知道他们是否真的希望你只为每个操作创建一个新的MOC.我错过了什么?

cocoa multithreading core-data objective-c

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

如何更新Core Data中的现有对象?

当我插入新对象时,我使用以下代码:

NSManagedObjectContext *context = [appDelegate managedObjectContext];

Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];

favorits.title = @"Some title";

NSError *error;                    
if (![context save:&error]) {
    NSLog(@"Whoops");
}
Run Code Online (Sandbox Code Playgroud)

如何更新核心数据中的现有对象?

core-data objective-c

60
推荐指数
3
解决办法
9万
查看次数

Xcode - 错误:pathspec'...'与git已知的任何文件都不匹配

我正在使用当地的git repo.当我尝试提交核心数据模型文件(.xcdatamodel)的更改时,我收到以下消息:

error: pathspec '.../DataModel.xcdatamodeld/DataModel.xcdatamodel/contents' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题,并像对待任何其他文件一样提交模型?

git xcode core-data

60
推荐指数
9
解决办法
3万
查看次数