gpt4 book ai didi

ios - 核心数据 : NSPredicate containing to-many relationship yields no results when using SQLITE store type

转载 作者:行者123 更新时间:2023-11-29 13:50:39 25 4
gpt4 key购买 nike

直到最近,我一直在为我的项目使用 Core Data 和 In-Memory 存储。现在我正在尝试切换到 SQLite 存储,但我面临以下问题:

当尝试使用谓词和 sortDescriptor 从商店中获取对象时,我的 fetchedResultsController 返回 0 个对象。当商店类型在内存中时,完全相同的代码可以正常工作。

这就是我进行提取的方式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K == %@", @"categories", category];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES selector:@selector(caseInsensitiveCompare:)];
self.fetchedResultsController = [self createFetchedResultsControllerWithEntityName : @"Provider" sectionName : @"group" sortDescriptor : sortDescriptor predicate : predicate cache : nil];

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

[self.tableView reloadData];

这是我创建获取请求的地方:

- (NSFetchedResultsController *)createFetchedResultsControllerWithEntityName : (NSString*) entityName sectionName : (NSString*) sectionName sortDescriptor : (NSSortDescriptor*) sortDescriptor predicate : (NSPredicate*) predicate cache : (NSString*) cacheName{ 

// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

//set predicate
if (predicate)
[fetchRequest setPredicate:predicate];

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:sectionName
cacheName:cacheName];
aFetchedResultsController.delegate = self;

[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];


return [aFetchedResultsController autorelease];

同样,这段完全相同的代码在使用内存存储时获取许多对象,但在使用 SQLite 时获取空的 fetchedObjects 数组。

我已阅读 Apple 的文档,了解在将谓词和 sortDescritors 与 SQLite 存储一起使用时的特殊注意事项。我在谓词中使用单个(多)对多关系(类别),所以这应该没问题?

抓取没有返回错误。根本没有对象(fetchedResultsController.fetchedObjects 是空的)。

任何指导将不胜感激。

谢谢

最佳答案

我终于解决了这个问题。

我的查询没有返回结果确实没有结果。追溯到我创建对象并用值填充关系的地方,我发现我做错了。我尝试这样做:

[provider.categories addObject : newCategory];

这并没有真正将 newCategory 添加到类别关系中。
在意识到 Core Data 会自动生成对多关系的访问器之后,我使用以下方法添加了新的类别:

[provider addCategoriesObject : newCategory];

这正确地将 newCategory 添加到关系中。

除此之外,我在 Provider.h 中声明了 addCategoriesObject 以抑制编译器警告。这为我解决了这个问题。

唯一剩下的警告是编译器没有找到 addCategoriesObject: 的实现并警告“不完整的实现”。我还没有想出一种方法来抑制这个警告。

关于ios - 核心数据 : NSPredicate containing to-many relationship yields no results when using SQLITE store type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4784281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com