我正在实现一个搜索字段,用户可以在其中键入字符串以过滤视图中显示的项目.显示的每个对象都有一个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模型中定义的属性时有效.
我在我的iPhone应用程序中使用CoreData,但CoreData没有提供允许您重新排序记录的自动方式.我想使用另一列来存储订单信息,但使用连续的数字来排序索引有一个问题.如果我处理大量数据,重新排序记录可能涉及更新订单信息上的大量记录(这有点像改变数组元素的顺序)
实施有效订购方案的最佳方法是什么?
我正在尝试更新实现核心数据存储的应用程序.我正在为其中一个实体添加一个属性.
我将以下代码添加到我的委托类:
- (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 …
我有两个名为"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'
有没有选择来检索所需的数据?
我最近将我的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) 我正在尝试以多线程方式使用核心数据.我只是想在后台下载新数据时显示以前下载的数据的应用程序.这应该让用户在更新过程中访问应用程序.
我有一个NSURLConnection使用委托异步下载文件(并显示进度),然后我使用XMLParser解析新数据并在单独的上下文中创建新的NSManagedObjects,具有自己的persistentStore并使用单独的线程.
问题是在显示新对象时在旧对象的同一上下文中创建新对象会抛出BAD_INSTRUCTION异常.所以,我决定为新数据使用单独的上下文,但是我无法找到一种方法,一旦完成就将所有对象移动到其他上下文.
Paolo又名SlowTree
我一直在创建一个列表应用程序并用核心数据支持它.
我想有一个默认的10个机场项目清单,这样用户就不必从头开始了.
有没有办法做到这一点?
任何帮助表示赞赏.提前致谢.
似乎在11月,Apple更新了NSManagedObjectContext类参考和核心数据编程指南文档,明确地将串行GCD调度队列和NSOperationQueues作为可接受的机制来同步访问NSManagedObjectContext.但他们的建议似乎含糊不清,可能相互矛盾,我想确保我已经理解它.
以前,公认的智慧似乎NSManagedObjectContext只能从创建它的线程访问,并且使用串行队列进行同步是不够的; 虽然串行队列一次只执行一个操作,但这些操作可能会在不同的线程上进行调度,而MOC不喜欢这样.
但是现在,从编程指南,我们有:
您可以使用线程,串行操作队列或调度队列进行并发.为了简明起见,本文始终使用"线程"来指代其中任何一个.
到目前为止,这么好(尽管他们对线程和队列的混淆是无益的).所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对吧?Apple甚至在Core Data WWDC会话中对此进行了直观描述.
但是......你在哪里为队列创建上下文?在NSManagedObjectContext文档中,Apple声明:
[上下文]假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.
所以现在我们有了一个NSManagedObjectContext需要知道它的主人是谁的想法.我假设这意味着要在队列中执行的第一个操作应该创建MOC并保存对它的引用以供剩余的操作使用.
这是正确的吗?我犹豫不决的唯一原因是NSManagedObjectContext文章继续说:
相反,您应该传递对持久性存储协调器的引用,并让接收线程/队列创建从该派生协调器派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.
Apple现在似乎将操作与安排执行的队列混为一谈.这是我的头脑,并让我想知道他们是否真的希望你只为每个操作创建一个新的MOC.我错过了什么?
当我插入新对象时,我使用以下代码:
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)
如何更新核心数据中的现有对象?
我正在使用当地的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)
如何解决这个问题,并像对待任何其他文件一样提交模型?
core-data ×10
ios ×5
iphone ×3
objective-c ×3
cocoa ×2
git ×1
ios10 ×1
nspredicate ×1
persist ×1
uitableview ×1
xcode ×1
xcode8 ×1