Сложный запрос CoreData (требуется синтаксис SQL)? - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть 2 объекта:

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 и я хочу получить (с одной выборкой, если это возможно) следующее:

  1. Только 2 исполнения на место:
    • Исполнение, которое выполняется (selectedTime BETWEEN {start, end})
    • Исполнение, которое начнется после того, которое выполняется в выбранное время

Я действительно потерян здесь: - / Даже если бы вы могли просто дать мне SQL-оператор для такой выборки / запроса, я бы по крайней мере знал, в каком направлении идти.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2011

Дух .. Я думаю, что нашел окончательное решение ..

Выбор довольно прост:

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];
        }
    }
}

Спасибо, что попробовали Андре!

0 голосов
/ 09 сентября 2011

Используя 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 <= selectedTime, вернуть 2 результата и (в коде?) Проверить, является ли дата окончания первого результата> = selectedTime.

...