Hej,
Problem jest następujący... używam CoreData do przechowywania danych, jeden entity składa się z ID oraz danych 1-2MB. Cała lokalna baza danych to kilka tysięcy obiektów entity czyli pokaźna ilość gigabajtów!
W procesie synchronizacji z bazą danych znajdującą się na serwerze dostaję listę ID, które nadal są ważne. W tym momencie mogę przeprowadzić maintenance bazy lokalnej usuwająć entity, które nie są ważne. Zaczynają się schody...
Pierwsze co nakazuje logika to fetchRequest zwracający array wszystkich obiektów typu entity, których ID można porównać z listą ID jaką dał serwer i jeśli ID nie będzie na liście to można entity usunąć z bazy. Niby proste ale fetch, jeśli dobrze rozumiem idee jego działania, będzie tworzył obiekty (kopie entity) w pamięci RAM czyli baza mająca kilka GB wyłoży się elegancko z powodu braku RAM.
Kolejny pomysł to seria oddzielnych fetchRequest dla każdego entity z określonym ID. Jest w bazie i jest na liście - zostaje, jest w bazie ale nie na liście - wypada. Pomysł miałki, bo robienie kilku tysięcy requestów z ID od 1 do największego ID zwróconego przez serwer to nieco strzelanie kulą w płot. Mało tego największy ID zwrócony przez serwer wcale nie oznacza, że w bazie lokalnej nie może być obiektów z ID większym... robi się coraz ciekawiej
Trzeciego pomysłu brak, to znaczy wiem co chcę dostać ale nie wiem jak dostać. Chciałbym array jedynie z listą ID wszystkich entity bez ich danych znajdujących się bazie. Da się to jakoś uzyskać? Jedyne co mi do głowy przychodzi to przetrzymywanie w bazie jednego dodatkowego entity nowego typu z tablicą zawierająca tylko i wyłącznie array IDów znajdujących się w bazie. Czy to jedyne rozwiązanie czy może jednak CoreData przewiduje takie problemy i ma gotowe rozwiązania?
---------- Wpis dodano o 11:30 ---------- Poprzedni wpis dodano o 09:42 ----------
Apple jednak o wszystkim pomyślałoKod poniżej zwróci array objektów NSDictionary, a w każdym tylko jeden klucz: id = wartość czyli dokładnie to o co mi chodziło, tylko i wyłącznie wartość ID bez danych.
Kod:- (NSArray *)databasePhotosIDs { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MPhoto" inManagedObjectContext:_dbPhotos.managedObjectContext]; [request setEntity:entity]; [request setResultType:NSDictionaryResultType]; NSExpression *expression = [NSExpression expressionForKeyPath:@"photo_id"]; NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [expressionDescription setName:@"id"]; [expressionDescription setExpression:expression]; [expressionDescription setExpressionResultType:NSInteger32AttributeType]; [request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]]; NSError *error = nil; NSArray *array = [_dbPhotos.managedObjectContext executeFetchRequest:request error:&error]; if (array == nil) { // error } [expressionDescription release]; [request release]; return array; }




LinkBack URL
About LinkBacks
