gpt4 book ai didi

core-data - NSFetchedResultsController 与 NSPredicate 不更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:21:10 26 4
gpt4 key购买 nike

我从核心数据库中获取数据并将它们呈现在 UITableView 中。我使用 NSFetchedResultController 来获取数据。我希望用户能够在数据库中进行搜索,为此我使用了 NSPredicate

数据显示在 UITableView 中,一切正常,直到我将 NSPredicate 设置为 NSFetchedResultController

我在 ViewDidLoad 方法中使用它:

    self.fetchedResultsController = nil;
fetchedResultsController_ = nil;

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

当用户从 UITextField 输入文本时,该文本将转到新的 NSPredicate

这是在搜索开始时完成的:

NSPredicate *pred = nil;
pred = [NSPredicate predicateWithFormat:@"(Designation BEGINSWITH '22')"];
[fetchedResultsController_.fetchRequest setPredicate:pred];

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

[tView reloadData];

现在我使用 @"(Designation BEGINSWITH '22')" 仅用于测试。

这是我的 NSFetchedResultsController:

    - (NSFetchedResultsController *)fetchedResultsController {

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

/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext];//self.managedObjectContext
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Designation" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

// 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:importContext sectionNameKeyPath:nil cacheName:@"Root"]; //self.managedObjectContext

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

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

return fetchedResultsController_;
}

问题是无论我如何或是否设置谓词,获取的数据都保持不变。如果我在 viewDidLoad 中设置谓词,它会起作用,但如果我再次尝试,我将无法获得新结果。我使用“importContext”批量导入我的 CoreData。

有什么想法吗?

提前致谢!

更新:好的,这是我发现的。我有一个 importContext,我可以在其中进行批量导入。对于 fetchController,我使用 self.managedObjectContext。这就是它不起作用的原因,所以我必须让 self.managedObjectContext 以某种方式与我的 importContext 具有相同的东西......

最佳答案

您正在使用缓存 (@"Root")...尝试将其设置为 nil,这可以防止崩溃。你不应该缓存 FetchedResultsControllers 意味着被预测。

关于core-data - NSFetchedResultsController 与 NSPredicate 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503616/

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