2016-08-10 6 views
1

Ich habe eine Live-App im App Store, die SQLite als Datenbank verwendet, jetzt mit dem nächsten Update I Core Data in App Laden Sie alle Daten aus .sqlite Datei implementieren möchten, ohne die App zu brechen . Ich habe Tutorials gelesen, aber es hat nicht viel geholfen. Ich weiß nicht, wie ich vorgehen soll. Bitte, weisen Sie mich in die richtige Richtung.SQLite zu Core Data Migration

+0

warum? Welchen Vorteil, denkst du, wirst du bekommen? Funktioniert Ihre vorhandene SQL-Lösung korrekt? Gibt es etwas, was es nicht kann? – Wain

Antwort

2

Aus den Kerndaten documentation:

Wie verwende ich meine vorhandene SQLite-Datenbank mit Core Data?

Sie nicht, es sei denn, Sie importieren Ihre vorhandene SQLite-Datenbank in einen Core Data Store . Obwohl Core Data SQLite als einen der persistenten Store-Typen unterstützt, ist das Datenbankformat privat. Sie können nicht erstellen eine SQLite-Datenbank mit der systemeigenen SQLite-API und verwenden Sie direkt mit Core Data. Wenn Sie über eine vorhandene SQLite-Datenbank verfügen, müssen Sie sie in einen Core Data-Speicher importieren ( ). Darüber hinaus tun keine vorhandenen Core Data erstellt SQLite Speicher manipulieren mit der nativen SQLite API

Sie können versuchen, mit dem Werkzeug https://github.com/tapasya/Sqlite2CoreData aber es scheint ziemlich outdate.

1

Die Schwierigkeit hängt hauptsächlich davon ab, wie gut Ihre Code-Architektur eingerichtet ist. Es gibt keine einfache Prozedur, um dies zu tun ... Hinzufügen von Core-Daten zum Projekt, wenn ziemlich einfach, Verständnis ist eine ganz andere Sache.

Hier ein paar Dinge, die Sie vielleicht auf Folgendes achten:

  • Coredata die SQLite-Datei auf seine eigene Weise zu erstellen, das heißt, Sie nicht jede .sqlite Datei einspeisen kann und das Beste hoffen. Sie müssen CoreData eine eigene Datei erstellen lassen und die Daten von Ihrem SQLite-Speicher auf die Core-Daten übertragen.

  • Ihre Tabellen werden zur Klasse (wie in den meisten ORM, es heißt Entities) und Sie können eine neue Entität nicht direkt instanziieren. Wenn Sie also eine Tabelle Employee haben, können Sie Employee * john = [[Employee Alloc] init nicht ausführen ]; Das geht nicht! Das Einfügen von Elementen liegt in der Verantwortung der NSEntityDescritpion-Klasse. So Ihr Code es für möglich, Fehler zu überprüfen ...

Wenn Kerndaten ein bisschen zu kompliziert ist, Realm ist eine gute ORM Alternative: https://realm.io/products/objc/

Viel Glück ...

2

Ich denke, @SaintThread traf hier das Hauptproblem. Der Grund dafür ist, dass Core Data kein Wrapper um SQLite ist - es ist eine andere API mit anderen Annahmen, die nur zufällig SQLite intern verwenden. Core Data versucht nicht, mit der Verwendung von SQLite kompatibel zu sein, wenn Sie SQLite alleine verwenden.

Wenn Sie dennoch migrieren möchten, müssen Sie ein Core Data-Modell entwerfen und dann vollständig benutzerdefinierten Code schreiben, um von Ihrer vorhandenen SQLite-Datei zu Core Data zu migrieren. Ihr Code müsste alles aus SQLite lesen, in die neue Core Data-Darstellung konvertieren, die Änderungen speichern und dann die vorhandenen SQLite-Dateien entfernen.

Wenn Sie die vorhandene SQLite-Datei entfernen, müssen Sie auch die SQLite-Journaldateien (falls vorhanden) entfernen.

0

Hier ist die Art, wie ich die Arbeit am besten fand; Aber stellen Sie sicher, dass Sie eine gute Fehlerbehandlung bei den Würfen verwenden.

Dies ist die ursprüngliche Art und Weise von Apple:

https://developer.apple.com/library/content/samplecode/CoreDataBooks/Listings/Classes_CoreDataBooksAppDelegate_m.html#//apple_ref/doc/uid/DTS40008405-Classes_CoreDataBooksAppDelegate_m-DontLinkElementID_8

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataBooks.CDBStore"]; 

/* 
Set up the store. 
For the sake of illustration, provide a pre-populated default store. 
*/ 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
// If the expected store doesn't exist, copy the default store. 
if (![fileManager fileExistsAtPath:[storeURL path]]) { 
    NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"CoreDataBooks" withExtension:@"CDBStore"]; 
    if (defaultStoreURL) { 
     [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL]; 
    } 
} 

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @YES, NSInferMappingModelAutomaticallyOption: @YES}; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

NSError *error; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 

....

Dies sind die neue Art und Weise - Xcode8

Swift 3 preload from SQL files in appDelegate

Core Data with pre-filled .sqlite (Swift3)

Why does not copy database.db from bundle to document directory in swift 3?

https://www.raywenderlich.com/145877/core-data-tutorial-multiple-managed-object-contexts-2

Verwandte Themen