Iphone 核心数据使用单个搜索字符串查询多个列
我有一个简单的核心数据模型,有两个字符串属性size和category。给定像“小部件”这样的搜索字符串,是否可以返回将所有查询词与至少一个属性相匹配的记录,即具有“小部件”大小和“小部件”类别的所有记录?我目前有:Iphone 核心数据使用单个搜索字符串查询多个列,iphone,objective-c,cocoa-touch,xcode,core-data,Iphone,Objective C,Cocoa Touch,Xcode,Core Data,我有一个简单的核心数据模型,有两个字符串属性size和category。给定像“小部件”这样的搜索字符串,是否可以返回将所有查询词与至少一个属性相匹配的记录,即具有“小部件”大小和“小部件”类别的所有记录?我目前有: NSString *search = @"small widget" NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size contains[cd] %@ OR category contains[cd]
NSString *search = @"small widget"
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"size contains[cd] %@ OR category contains[cd] %@", search, search];
...
这不会返回任何结果,因为没有类别或大小等于小部件。有什么建议吗?请注意,搜索字符串将由用户从文本字段中输入,并且可能以任何顺序出现,因此我无法手动拆分。我尚未对其进行测试,但看起来您希望这样:
NSString *search = @"small widget";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ contains[cd] size AND %@ contains[cd] category", search, search];
搜索字符串是否包含大小和类别,您应该询问搜索字符串中是否包含当前大小或类别
您还可以拆分搜索字符串并修改谓词。你应该让他们确定哪个表现更好
NSString *search = @"small widget";
NSArray *array = [search componentsSeparatedByString:@" "];
NSMutableArray *subPredicates = [NSMutableArray array];
for (NSString *q in array) {
[subPredicates addObject:
[NSPredicate predicateWithFormat:@"size contains[cd] %@ OR category contains[cd] %@", q, q]];
}
NSCompoundPredicate *predicate = [[[NSCompoundPredicate alloc] initWithType:NSAndPredicateType
subpredicates:subPredicates] autorelease];
对于Swift,您可以使用propertiesToFetch获取多个列
对于第一个例子,当查询是“小部件”时,这不匹配“大部件”吗?同样,我认为第二个也有同样的问题。使用NSAndPredicateType而不是NSOrPredicateType如何?所以,你可以让size包含“small”或者category包含“small”,size包含“widget”或者category包含“widget”。正如我所说,我还没有测试过它。虽然我认为你是对的。在第一个示例中,我使用了and和,因此字符串应该包含两个组件才能为true,而在第二个示例中,NSAndPredicateType将完成这项工作。干杯,vfn
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "<YOUR ENTITY NAME>")
let predicate = NSPredicate(format: "<YOUR PREDICATE>")
fetchRequest.predicate = predicate
fetchRequest.resultType = .dictionaryResultType
// Here is where you can query multiple columns, you can add as much columns as you want and fetch them as an array of dictionaries
fetchRequest.propertiesToFetch = ["column1", "column2", "column3, "column4"]
let sort = NSSortDescriptor(key: "column1", ascending: false)
fetchRequest.sortDescriptors = [sort]