我有两个实体:
Performance.start (NSDate) Location.coordinates
Performance.end (NSDate) Location.name_extern
Performance.location <<--> Location.performances
我的NSFetchedResultsController
设置UITableView
,代码如下:
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"location.name_extern"
cacheName:nil];
因此,数据按位置(名称)分为几个部分。
现在我有一个selectedTime
类型的变量NSDate
,并且想要获取(如果可能的话,只需一次获取)以下内容:
(selectedTime BETWEEN {start, end})
我真的迷失在这里: - /即使你可以给我这样一个获取/查询的SQL语句,我至少知道要走向哪个方向..
答案 0 :(得分:0)
使用SQL,您可以尝试这样的事情:
SELECT *
FROM Performance p, (
SELECT *
FROM Performance
WHERE start <= selectedTime AND end >= selectedTime
ORDER BY start ASC
LIMIT 1
) AS p1
WHERE p.start >= p1.start
ORDER BY p.start ASC
LIMIT 2
虽然您必须决定如何处理当时没有性能运行的情况。
使用核心数据,您只需按开始日期(ASC)订购它们,使用start&lt; = selectedTime,返回2结果,以及(在代码中?)检查第一个结果的结束日期是否为&gt; = selectedTime
答案 1 :(得分:0)
Duh ..我想我找到了最终解决方案..
获取非常简单:
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Performance" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort1 = [[NSSortDescriptor alloc]
initWithKey:@"location.name_extern" ascending:YES];
NSSortDescriptor *sort2 = [[NSSortDescriptor alloc]
initWithKey:@"start" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort1,sort2,nil]];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"location.name_extern"
cacheName:nil];
使用以下谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"end > %@",selectedTime];
[fetchRequest setPredicate:predicate];
以下是我解决“每个位置/部分只有2个”的部分:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
if (selectedTime == nil)
{
return [sectionInfo numberOfObjects];
}
else
{
if ([sectionInfo numberOfObjects] > 2)
{
return 2;
}
else
{
return [sectionInfo numberOfObjects];
}
}
}
感谢André尝试!