2012-03-11 11 views
9

Wystąpił problem.Jak zapobiec powielaniu danych podstawowych w systemie iOS 5?

Przez weekend pracowałem nad projektem, w którym przeciągam duży xml z serwisu WWW.

W zasadzie ma 3 poziomy - klienci, menedżerowie, personel - wszystkie hierarchiczne. Tak więc po uruchomieniu aplikacji po raz pierwszy pobiera ten xml i analizuje go i tworzy wszystkie wpisy w 3 odpowiednich Elementach - Klientach, Menedżerach i Personelu.

Za każdym razem, gdy uruchamiana jest aplikacja, muszę usunąć ten sam kod XML, ale tym razem wystarczy "zaktualizować" dowolny z istniejących rekordów, które uległy zmianie, lub dodać nowe dla nowych klientów, menedżerów lub personelu pojawiły się od ostatniego razu.

A więc - w tej chwili, jak już powiedziałem, wszystko to ciągnie, parsuje poprawnie i tworzy właściwe byty i wypełnia wszystkie atrybuty.

Jednak bez zmiany danych, na 2 premiery to powielenie wszystkich danych - tak zamiast 15 klientów (prawidłowy numer) Mam 30 i tak dalej ...

Czy naprawdę muszę dodać dużo kodu w mojej analizie, aby sprawdzić, czy zamiast tworzyć nowy obiekt NSManagedObject, sprawdzam, czy już tam jest?

A jeśli tak - muszę ręcznie sprawdzić każdy atrybut?

To okropnie bolesne i długotrwałe - czy nie ma sposobu, aby Core Data zrobiła coś dla mnie - automatycznie?

Dzięki za pomoc lub sugestie.

Odpowiedz

3

Jak stwierdzono w Apple Docs https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

Trzeba pętli modelu danych i obsługiwać go stamtąd jak to

przykładu :

// loop over employeeIDs 
// anID = ... each employeeID in turn 
// within body of loop 

NSString *predicateString = [NSString stringWithFormat: @"employeeID == %@", anID]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 

Osobiście nie li ke tej metody i napisałem ten fragment kodu, który obsługuje to w pro-sprawnym dworku i który jest prosty! Zauważyłem, że z metodą Apples napotkałem problemy z ciągami o różnych znakach, takich jak litery i spacje. Poniższy kod jest testowany i działa poprawnie, jeśli poprawnie zmienisz nazwy wszystkich swoich obiektów. Szczerze wierzę, że jest to najskuteczniejszy sposób, aby nie dodawać duplikatów w danych podstawowych.

-(void)AvoidDuplicatesinDataModel 
{ 
    // Define our table/entity to use 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" 
               inManagedObjectContext:managedObjectContext]; 

    // Setup the fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Define how we will sort the records 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"users" 
                    ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    // Fetch the records and handle an error 
    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
              executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // Handle the error. 
     // This is a serious error 
    } 

    //here usersNameTextField.text can be any (id) string that you are searching for 
    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:usernameTextField.text]) { 
     //Alert user or handle your duplicate methods from here 
     return; 
    } 
} 
+0

dlaczego zmienne kopiowanie wyników pobierania? – dmur

12

Obawiam się, że trzeba dbać o czystość bazy danych. Najprostszym sposobem byłoby użycie numeru NSFetchRequest: Podczas importowania zaktualizowanych danych można uruchomić zapytanie na podstawie istniejących danych i zdecydować, co należy zrobić.

Marcus S. Zarra wspomniano w another thread o tym temacie:

Podczas sprowadzania nowego wiersza można uruchomić kwerendę przeciwko istniejących wierszy, aby zobaczyć, czy jest już na miejscu. W tym celu należy utworzyć się NSFetchRequest przeciw jednostce, ustaw orzeczenie szukać właściwość GUID i ustawić max wiersze zwrócone 1.

Polecam utrzymując ten NSFetchRequest wokół podczas importu tak, że można użyj go ponownie podczas importowania. Jeśli NSFetchRequest zwraca wiersz, można zaktualizować ten wiersz. Jeśli nie zwróci wiersza, możesz wstawić nowy wiersz.

Po wykonaniu poprawnie można uznać, że wydajność jest większa niż akceptowalna.

Innym źródłem dobrych informacji są jabłka Programowanie Przewodnicy: Core Data Programming Guide

+0

Tak, pomyślałem. – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun Jeśli mój post był pomocny, możesz go zaakceptować :) – dom

+1

Link jest martwy – Besi

Powiązane problemy