CoreData sinnvollster Weg Daten mitzuliefern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData sinnvollster Weg Daten mitzuliefern

    Ich habe folgendes Szenario:
    Meine App nutzt CoreData, dabei sind alle Daten bereits vorhanden, d.h. der Nutzer selbst kann keine neuen Daten erzeugen, nur ein paar wenige bearbeiten.
    Ich habe bereits einen Code geschrieben welcher meine Daten ins Datamodel einfügt. Nun frage ich mich was wäre der sinnvollste Weg diese Daten mitzuliefern?
    Bisher handhabe ich es so dass ich die fertige SQLite Datenbank ins Main Bundle packe und dann beim ersten Start der App in den Documents Folder kopiere. Funktioniert auch ohne Probleme. Was mich persönlich jedoch etwas "stört" ist dass die Datenbank dann natürlich trotzdem weiterhin unnütz auch im Main Bundle liegt und die App somit mehr Speicher wegnimmt als sie müsste (auch wenn es in meinem Fall nur 500 KB) sind.
    Darum frage ich mich ob das wirklich der sinnvollste Weg ist, oder ob ich den Code, welche die Daten erzeugt nicht lieber in die App integrieren sollte. Hätte dann jedoch zur Folge dass ich einen Haufen Code in der App habe, der nur ein einziges mal beim ersten Start benötigt wird. Außerdem würde die App beim ersten Start ein wenig länger brauchen, weil ja erst die ganzen Daten erzeugt werden müssen und nicht nur die fertige Datenbank in den Dokuments Folder kopiert werden muss.

    Was wäre hier sinnvoller? Oder sind vielleicht beide Wege verkehrt und es gibt einen besseren mir unbekannten Weg?

    Hoffe ich konnte das ganze verständlich rüber bringen.
  • Besteht die Wahrscheinlichkeit, dass Deine App einmal eine Import-Funktion benötigt? Vielleicht, weil Du eine Backup-Möglichkeit bieten möchtest, AirDrop unterstützen oder auch andere Optionen des Datenaustausches... Dann schreibe diese Routine jetzt und lege Dir die initialen Daten in's Bundle: Zwei Fliegen mit einer Klappe...

    Allerdings benötigt das natürlich auch (etwa) den doppelten Speicherplatz, um den ich mr bei 500 KB aber keine Gedanken machen würde.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Wie gesagt ein paar wenige Attribute sind änderbar, auch wenn nicht sonderlich viele.
    Beispielsweise habe ich eine Entity mit 13 Attributen, davon sind 7 vom User änderbar sind. Diese Entity hat dann noch paar Relationships zu anderen Entities, welche wiederum nahezu ausschließlich readonly sind.
    Außerdem bietet CoreData mir so praktische Dinge wie den FetchedResultsController. :P
  • MyMattes schrieb:

    Besteht die Wahrscheinlichkeit, dass Deine App einmal eine Import-Funktion benötigt? Vielleicht, weil Du eine Backup-Möglichkeit bieten möchtest, AirDrop unterstützen oder auch andere Optionen des Datenaustausches... Dann schreibe diese Routine jetzt und lege Dir die initialen Daten in's Bundle: Zwei Fliegen mit einer Klappe...

    Allerdings benötigt das natürlich auch (etwa) den doppelten Speicherplatz, um den ich mr bei 500 KB aber keine Gedanken machen würde.


    Mattes
    Ein Datentausch findet bei ein paar wenigen Werten mit anderen Nutzern der App statt. Dieser erfolgt über meinen Server.
    Ja 500 KB sind mit Sicherheit nichts schlimmes, mich interessiert ja auch nur ob es bessere Lösungen gibt, weil ich es doch irgendwie ein wenig unschön finde.
  • Mach dir auch über updates gedanken bevor du deine erste version released.
    Also was passiert wenn sich die vorberechneten danten ändern oder was dazukommt.
    Dann kannst du nicht einfach diese DB in den Documents-Folder kopieren weil du dann die user-daten änderst.
    Ist es wirklich so aufwändig die read-only daten von den user-daten zu trennen und somit 2 datasources zu haben?
  • Die Datenbank wird ja nur beim ersten Start der App in den Documents Folder verschoben, daraufhin läuft dann ausschließlich alles über die im Documents Folder. Wenn sich die Daten ändern, wird das mit einem Update, bei der Datenbank welche im Documents Folder liegt, eben gemacht. Neue User hingegen würden die neue Version in den Documents Folder hinein kopiert bekommen.
    Ist dann natürlich etwas Code welcher geschrieben werden muss, für jedes Update wo sich was ändert.

    Die Daten trennen wäre mit ein paar Kniffs wohl möglich. Ein paar grobe Ideen fallen mir dazu zumindest ein, müsste ich mich mal hinsetzen und etwas genauer drüber nachdenken, wie sich das am besten machen ließe.
    Ich dachte bisher halt irgendwie immer CoreData wäre die beste und schnellste Möglichkeit, für jede Art von Datenbank in iOS Apps. Schließlich gibt es ja ein paar neue Funktionen wie den FetchedResultsController, die ich dadurch habe.
    Wenn ich das ganze hier jedoch richtig verstehe ist CoreData für read-only Daten nicht grad der beste Weg, stimmt das so?
  • Butterkeks schrieb:

    Die Datenbank wird ja nur beim ersten Start der App in den Documents Folder verschoben, daraufhin läuft dann ausschließlich alles über die im Documents Folder. Wenn sich die Daten ändern, wird das mit einem Update, bei der Datenbank welche im Documents Folder liegt, eben gemacht. Neue User hingegen würden die neue Version in den Documents Folder hinein kopiert bekommen.
    Bestandskunden bekommen also keine Updates?
  • Hab mal ein wenig rumgeforscht und noch mal eine Frage hier zu:
    Wenn ich dem PersistantContainer sage dass sich die Datenbank im MainBundle befindet, kann ich dann auch die Datenbank aus dem MainBundle mit CoreData managen? Dachte immer das sei nicht möglich, bin mir jetzt aber auch nicht sicher.

    Hätte die Idee dann die Readonly Daten im MainBundle mitzuliefern und die paar einzelnen Daten, die verändert werden können, auszulagern. Dann hätte ich zwar zwei Datamodels und 2 Datenbanken, welche dann über einen kleinen Umweg miteinander kommunizieren, aber zumindest nichts was doppelten Speicherplatz verbrauch.
    Wäre das sinnvoll?
  • gandhi schrieb:

    Butterkeks schrieb:

    Wenn ich dem PersistantContainer sage dass sich die Datenbank im MainBundle befindet, kann ich dann auch die Datenbank aus dem MainBundle mit CoreData managen?
    Ja, natürlich. Wie ich oben schon schrieb: Der Ressources-Ordner deines Bundles ist der natürliche Platz für sowas.
    Achso ok sorry, ich dachte du meinst dass ganze dann ohne Core Data, heißt einfach nur über SQLite alles machen. Mir war bisher einfach nicht bewusst das man mit CoreData auch auf eine Datenbank zugreifen kann, welche im MainBundle liegt.