2011-04-12 13 views
7

nie mogę znaleźć dokładny opis tych etapów w Dokumentach jabłko ...Rdzeń Dane zawarte w App Store Bundle

  1. Mam xcdatamodeld w moim projekcie xcode
  2. W czasie startu, moja aplikacja analizowania XML (projekt zasobów) do wypełnienia danych Core Store (SQLLite)
  3. w czasie trwania mojej aplikacji, dodać, usunąć dane aktualizacyjne tego Store

teraz chcę przestać to robić ciężki Proces analizowania XML na urządzeniu i bezpośrednio ly zawierać sklep zawierający wymagane dane.

Mam kilka pytań dotyczących tego:

  • mogę wypełnić sklepu z aplikacji OS X, a następnie uwzględnić ten sklep w moim projekcie XCode-IOS?
  • Mój sklep nie pojawia się w Xcode. W rzeczywistości jest tworzony w czasie wykonywania. Jak mogę dodać sklep do projektu i połączyć go z moim xcdatamodeld?
  • Czytałem, że spowoduje to, że mój sklep nie będzie zapisywalny ... Myślę, że muszę go skopiować we właściwym miejscu w czasie uruchamiania (samouczek narzędzia Core Data to dla niego wielka pomoc). Czy mam rację ?

Dzięki za wskazówki. Adres URL lub inne pytania SO byłyby naprawdę doceniane!

Kheraud

Odpowiedz

14

Możesz dołączyć plik możliwy (SQLite db większość czasu) w swojej aplikacji. Następnie w aplikacji delegata Edytowanie persistentStoreCoordinator getter merhod:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"]; 

    // Check if the store exists in. 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
     // copy the payload to the store location. 
     NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"]; 

     NSError *error = nil; 
     [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error]; 

     if (error){ 
      NSLog(@"Error copying payload: %@", error); 
     } 
    } 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 
+0

Dzięki za fragment kodu. Czy nie sądzisz, że mogą występować problemy ze zgodnością między urządzeniem/Core Data/skopiowanym DB? – iwalktheline

+0

Nie, głównie tworzę db z symulatorem, a potem używam go na urządzeniu, nie ma problemu. – rckoenes

+0

W drugim zdaniu odpowiedzi, czym jest ** persantstore **? (literówka?) – David

6

Co aktualnie robi (wypełniania przy pierwszym uruchomieniu) jest „zalecany” sposób wypełniania magazyn danych Core. Chociaż jego nieco hackish, można jednak nasion bazę danych na urządzeniu, co następuje:

  1. uruchomić aplikację w symulatorze
  2. robić, co trzeba zrobić dla aplikacji symulatora do zapełniania magazynu danych Core
  3. Zatrzymaj aplikację symulator
  4. Przejdź do folderu Dokumenty symulowanej (coś jak ~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/)
  5. Znajdź bazy danych sQLite (to nazwa, którą podał podczas inicjalizacji danych Core)
  6. Co. puj tę bazę danych do projektu i dodaj ją do skopiowania jako zasób
  7. Dodaj kod do swojej metody application:didFinishLaunchingWithOptions:, aby przy pierwszym uruchomieniu kopiować bazę danych z katalogu zasobów tylko do odczytu do katalogu dokumentów aplikacji. Oczywiście musisz to zrobić przed inicjalizując Core Data.

W zależności od tego, co dokładnie przechowujesz w swojej bazie danych, możesz odkryć problemy związane z dużymi lub mniejszymi rozmiarami lub innymi niezgodnościami.Aby uczynić to podejście nieco bezpieczniejszym, można zrzucić bazę danych symulatora (splite3 databasefile .dump >dumpfile) na komputerze Mac, a następnie dołączyć plik dumpfile do projektu (jak wyżej) i przesłać zrzut w aplikacji przy pierwszym uruchomieniu (czytając wiersz po tekście) linii i przekazywanie instrukcji sql do interfejsu API sqlite).

+0

Ok. Wydaje się, że za pomocą SQL dump i parse + fill jest dobrym sposobem. Ale radzenie sobie z XMLem nie jest o wiele bardziej skomplikowane (chyba). Ponadto otrzymuję dane XML za pośrednictwem sieci i muszę je przeanalizować. Zachowam moją mechanikę XML, tak jak jest ... Dzięki za pomoc, mógłbym użyć jej później :) – iwalktheline

10
  1. Napisz aplikację użytkową, korzystając z modelu danych i klas dla aplikacji. Użyj aplikacji narzędziowej do wygenerowania stałego magazynu z danych dostarczonych przez XML.
  2. Dodaj plik sklepu do pakietu aplikacji, tak jak każdy inny zasób.
  3. Wybierz lokalizację w katalogu aplikacji, w której chcesz przechowywać aktywny magazyn, np. katalog biblioteki.
  4. Po uruchomieniu sprawdź aplikację, czy sklep jest obecny w katalogu. Jeśli tak nie jest, aplikacja powinna skopiować sklep z pakietu aplikacji do katalogu przy użyciu standardowych metod NSFileManger, tak jak każdy inny plik. (Zazwyczaj wystarczy to zrobić przy pierwszym utworzeniu sklepu.)

To wszystko, co naprawdę jest do tego.

+2

czy to jest OK, jeśli przechowuję plik sqlite w pakiecie, ponieważ jest on tylko do odczytu ?? – onmyway133

+0

Core Data chce znaleźć pliki sqlite w katalogu aplikacji aplikacji: 'try FileManager.default.url (dla: .applicationSupportDirectory, \t \t \t w: .userDomainMask, proper For: nil, create: false)' jest jednym ze sposobów, aby to uzyskać. Można jednak zachować KOPIĘ pliku (-ów) w pakiecie, aby skopiować go do obsługi aplikacji, jeśli wstępnie ładujesz bazę danych. - oops, to oczywiście Swift, bo to kilka lat później ;-) – leanne

Powiązane problemy