- (void)fetchResult
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Project" ascending:YES];
[request setEntity:self.entityDescription];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
NSError *fetchError = nil;
BOOL success = [self.fetchResultController performFetch:&fetchError];
if (success) {
NSLog(@"fetched!");
}
else {
NSLog(@"fetch fail!");
}
}
Run Code Online (Sandbox Code Playgroud)
entityDescription和context是在viewDidLoad方法中设置的,如下所示:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
self.entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
崩溃信息: *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'在实体中找不到keypath项目'
有人可以伸手吗?;)
我编写了一种从数据库中随机获取记录的方法,但是无论NSFetchRequest.fetchOffset是什么,我经常会得到相同的记录。
所以我做了一个实验,这是我的代码:
- (Card *)getNextCard {
Card *card = nil;
while (YES) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
request.fetchLimit = 1;
request.fetchOffset = arc4random_uniform(1031);
NSError *error = nil;
NSArray *matches = [self.database.managedObjectContext executeFetchRequest:request error:&error];
if (matches) {
card = [matches lastObject];
// card.phEn= @"phonetic";
}
NSLog(@"nextCard: %@, %d", card ? card.en : card, request.fetchOffset);
}
return card;
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,日志就像:
2013-05-07 23:11:16.035 MyApp[20598:707] nextCard: astound, 153
2013-05-07 23:11:17.175 MyApp[20598:707] nextCard: complicate, 370
2013-05-07 23:11:18.335 MyApp[20598:707] nextCard: hasten, 954
2013-05-07 23:11:19.801 MyApp[20598:707] …Run Code Online (Sandbox Code Playgroud) 我在表视图中使用了一个获取的结果控制器,一切正常,除了请求还获取我的实体类型的子类这一事实,我不会.有没有办法做到这一点?控制器以通常的方式实例化.
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext: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:@"date" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for …Run Code Online (Sandbox Code Playgroud) 你的ViewController中的Hello:
[super viewDidLoad];
context = [[AppDelegate sharedAppDelegate] managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Items" inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:&error];
if(error){
NSLog(@"++++++++");
return;
}
NSLog(@"ARRRAY====%@",[results valueForKey:@"items"] );
Run Code Online (Sandbox Code Playgroud)
数据是:
("null>", MyGoodData)
Run Code Online (Sandbox Code Playgroud)
如果我在AppDelegate中调用此代码,那么确定:
数据是:
(MyGoodData)
Run Code Online (Sandbox Code Playgroud) 在我的模型中,我有一个 Sale 实体,每个 Sale 实体都有一个日期属性 (NSDate)。我想计算每个月的销售额总和。
我知道如何创建计算总和的表达式,我想知道如何告诉 NSFetchRequest 按月分组。
NSFetchResultController与NSFetchRequest具有fetchBatchSize = 20总是返回所有实体。它可以是什么?我没有使用 sectionKeyPath 并尝试了不同的排序描述符,但它仍然返回所有对象。
谢谢回复!我会详细说明的。我有一个具有两个字段的实体 - 距离和时间。我已经创建了 NSFetchResultController:
func noticesFetcher() -> NSFetchedResultsController {
let fetchRequest = NSFetchRequest()
let defaultStore = RKManagedObjectStore.defaultStore()
let entity = NSEntityDescription.entityForName("Notice", inManagedObjectContext: defaultStore.mainQueueManagedObjectContext)
fetchRequest.entity = entity
let distanceSortDescriptor = NSSortDescriptor(key: "distance", ascending: true)
let timeSortDescriptor = NSSortDescriptor(key: "time", ascending: false)
let sortDescriptors = [distanceSortDescriptor, timeSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors
fetchRequest.fetchBatchSize = 20
let resultFetcher = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: defaultStore.mainQueueManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
return resultFetcher
}
Run Code Online (Sandbox Code Playgroud)
但是当我执行 fetcher 时,我总是将所有实体都放在数据库中。(100)
func performFetcher(fetcher: …Run Code Online (Sandbox Code Playgroud)