我们不能在不提供NSSortDescriptor的情况下使用NSFetchRequest.我想要做的就是获取结果并按照创建顺序显示它们.有没有内置方法可以做到这一点?还是我必须创建一个新的"自动增量"字段?(在我看来,这与CoreData所代表的一切相悖).
我有一个获取的结果控制器,它应该显示具有多个子实体的某个实体的所有项目.
获取结果控制器中的部分应基于实体名称,即项目所属的子实体.设置sectionNameKeyPath到@"entity.name"工程.
但是,似乎无法为获取请求获取正确的排序描述符.像是[NSSortDescriptor sortDescriptorWithKey:@"entity.name" ascending:YES]导致错误的事情keypath entity.name not found in entity Something.
core-data objective-c nsfetchedresultscontroller nsfetchrequest ios
我正在开发一个基于核心数据的应用程序中的搜索功能,我正在尝试收集每个人的搜索优化提示,以尽可能快地获取它.搜索需要足够快,以便为20,000多个对象的数据库提供近乎即时的结果.
到目前为止我做了什么(就优化而言)
name索引关键字实体的属性,并在初始导入过程中通过拆分主要实体中的相关字符串并对其进行规范化来创建关键字(剥离大小写和变音符号)>=和<二进制比较器代替BEGINSWITH,等等.我的谓词格式是:SUBQUERY(keywords, $keyword, ($keyword.name >= $LB) AND ($keyword.name < $UB)).@count != 0
$LB下界字符串在哪里,$UB是上限.我AND使用此格式和搜索项数组创建复合谓词.
现在,我正在执行一次获取(当用户键入第一个字母时)使用大约20的获取批量大小,然后在继续键入时使用NSArray的-filteredArrayUsingPredicate方法缩小搜索结果.我也预取了这个keywords关系,因为它用于过滤.显然,占用时间最多的部分是初始提取.在大约15,000个对象的库上有大约1-2秒的显着延迟.时间分析表明它确实是导致延迟的提取:
http://cl.ly/3a1b2022452M2V323f2H
值得注意的另一件事是我必须为结果获取多个实体.所有实体都有一个ranking属性,但我不能一次获取多个实体,因此我不得不单独获取它们,将它们组合成一个数组,然后通过手动排序-sortedArrayUsingDescriptors.
任何有关如何提高速度的提示都将不胜感激.
编辑:基于@ImHuntingWabbits的建议:
添加KeywordFirstChar实体后,我的数据模型(简化)将如下所示:

现在,问题是如何为Car基于提取的实体编写谓词KeywordFirstChar?我唯一能想到的就是:
SUBQUERY(keywords, $keyword, $keyword.firstChar.char == %@)%@要搜索的字符在哪里,但我不知道如果它仍然需要枚举keywords,这会更有效率,除非我误解了这些建议.
我使用NSPredicate尝试了以下内容,但是没有得到我期望的结果:
NSFetchRequest request = new NSFetchRequest ();
request.Entity = NSEntityDescription.EntityForName("Entity", managedObjectContext);
NSSortDescriptor sort = new NSSortDescriptor ("date", false);
request.SortDescriptors = new NSSortDescriptor[1] { sort };
request.Predicate = NSPredicate.FromFormat("stringProperty == %@", new NSObject[1]{new NSString("someString")});
error = null;
NSObject[] results = managedObjectContext.ExecuteFetchRequest (request, out error);
Run Code Online (Sandbox Code Playgroud)
在当前稳定版的MonoTouch(5.0)中是否支持NSPredicate,或者我做错了什么?
我正在开发和应用程序,需要检查字符串是否已保存到数据库.这似乎是一个简单的操作,但它需要半秒才能返回任何我认为非常多的响应.我的问题是,是否有任何方法可以缩短时间.谢谢你的关注.
这是我目前的代码:
- (BOOL) isDeleted:(int)i {
NSString *value = [NSString stringWithFormat:@"deleted.*.%i", i];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSString *entityName = @"Deleted";
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(deletedpics like %@)", value];
[request setPredicate:pred];
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
BOOL returnBool = [objects count] >= 1 ? YES : NO;
return returnBool;
}
Run Code Online (Sandbox Code Playgroud) 我在添加关系后获取对象时遇到问题.我第一次获取类别,总是找到,然后当我添加到关系时,找不到以下类别.
这种关系是一种Many-To-Many.
例:
categoryId = 10如果几个类别相同id,则categoryId = 10找不到
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:self.model.context];
__block NSError *error = nil;
[private performBlockAndWait:^{
GPDeal *deal = [EKManagedObjectMapper objectFromExternalRepresentation:dic withMapping:[GPDeal objectMapping] inManagedObjectContext:private];
for (NSDictionary *dic in responseObject[@"response"]) {
GPCategory *category;
//The first time always found
if ((category = [GPCategory MR_findFirstByAttribute:@"catId" withValue:dic[@"mainAttribute"] inContext:private])) {
NSLog(@"Found");
[category addDealsObject:deal];
} else {
NSLog(@"Not Found");
}
}
}];
NSError *PrivateError = nil;
if (![private …Run Code Online (Sandbox Code Playgroud)我有一个核心数据应用程序,其模型设置如下图所示:
关系设置如下:
类别<-->>子类别<-->>项目
现在,是否可以在一次提取中从具有名为“categoryName”的相同属性的 Subcategory 和 Item 实体获取对象?我认为可以通过使用关系来完成,但我使用的代码不起作用,即:
let fetchNote = NSFetchRequest(entityName: "Category")
fetchNote.predicate = NSPredicate(format: "ANY subcategory.name == %@ AND item.name == %@", "Badaue", "Badaue")
let notes = try! appDel.managedObjectContext.executeFetchRequest(fetchNote) as? [Category]
print(notes)
Run Code Online (Sandbox Code Playgroud) 我有一个带有属性recipeID的实体配方.如何在Swift中将max(recipeID)作为Int值?
我很快,请帮助我.提前致谢.
func fetchMaxID() {
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Recipe")
fetchRequest.fetchLimit = 1
let sortDescriptor = NSSortDescriptor(key: "recipeID", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
do {
let maxID = try [managedObjectContext?.executeFetchRequest(fetchRequest)].first
print(maxID)
} catch _ {
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 NSPersistentContainer 访问 iOS10 应用程序和 Xcode 8 中的核心数据。与 Entity 类似,我在 Coredata xcdatamodel 中添加了“UserFetchRequest”。下面是屏幕截图。
如何访问代码中的“UserFetchRequest”?
我有一个使用@FetchRequest从CoreData中显示对象的列表,我想为用户提供一个条形按钮,单击该按钮将过滤显示的列表。如何更改@FetchRequest谓词并动态地重新运行它,以使用过滤后的项目重建列表?
struct EmployeeListView : View {
@FetchRequest(
entity: Department.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Department.name, ascending: false)],
)
var depts: FetchedResults<Department>
@Environment(\.managedObjectContext) var moc
var body: some View {
NavigationView {
List {
ForEach(depts, id: \.self) { dept in
Section(header: Text(dept.name)) {
ForEach(dept.employees, id: \.self) { emp in
Text(emp.name)
}
}
}
}
.navigationBarTitle("Employees")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何提供过滤器,我不知道如何更改属性包装器谓词并重新运行获取请求。
nsfetchrequest ×10
core-data ×8
ios ×5
objective-c ×4
iphone ×2
swift ×2
c# ×1
macos ×1
nspredicate ×1
optimization ×1
performance ×1
relationship ×1
swiftui ×1
xamarin.ios ×1
xcdatamodel ×1