größere datenmengen speichern und abrufen

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

  • größere datenmengen speichern und abrufen

    Hallo,

    ich arbeite an einer App, die Geodaten auf einer Karte anzeigt. Nun funktioniert es mit dem direkten Geocoding Anfragen (z.B. google) nicht so schnell, wie ich es brauche. Pro Anfrage sind es ca. 50-400 Punkte, die angezeigt und omit auch abgerufen werden müssen (anhand von gegebenen Adressdaten). Nach einer weile hängt sich die App auf, je nach Internetverbindung mal langsamer, mal schneller.
    Jetzt wollte ich versuchen das ganze offline hinzubekommen und habe einen Datensatz mit über 8000 PLZs (mit dazugehörigen Städtenamen und Koordinaten).
    Ich habe an ein Dictionarys gedacht, indem ich für jeden Anfangsbuchstaben eins anlege und die Datenmenge pro Dictionary klein halte. Problem ist, dass ich für jede PLZ Breiten- und Längengrad habe. Ich habe mir überlegt beides in einem String zu Speichern und nach dem Abrufen zu trennen (was aber evt. zu lange dauern würde). Zudem müsste ich bei jedem Programmstart die entsprechende text, bzw. csv Datei laden. Welche Ansätze würden denn für ein solches Mapping noch in Frage kommen?
  • gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?


    genau das sollst du ja nicht.
    du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?
  • urindanger schrieb:

    gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?


    genau das sollst du ja nicht.
    du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?


    verstehe nicht was du mit "der datei" meinst.
    du hast zb eine sqlite-datenbank und an die sendest du dann eine query und erwartest genau 1 resultat. es macht keinen sinn quasi alle resultate beim start der app in den speicher zu laden.
  • urindanger schrieb:

    gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?
    genau das sollst du ja nicht. du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?
    verstehe nicht was du mit "der datei" meinst. du hast zb eine sqlite-datenbank und an die sendest du dann eine query und erwartest genau 1 resultat. es macht keinen sinn quasi alle resultate beim start der app in den speicher zu laden.
    Er meint das Migrieren der SQlite-Datei in CoreData
  • matz schrieb:

    urindanger schrieb:

    gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?


    genau das sollst du ja nicht.
    du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?


    verstehe nicht was du mit "der datei" meinst.
    du hast zb eine sqlite-datenbank und an die sendest du dann eine query und erwartest genau 1 resultat. es macht keinen sinn quasi alle resultate beim start der app in den speicher zu laden.

    Er meint das Migrieren der SQlite-Datei in CoreData


    warum sollte er das tun?
  • gritsch schrieb:

    matz schrieb:

    urindanger schrieb:

    gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?


    genau das sollst du ja nicht.
    du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?


    verstehe nicht was du mit "der datei" meinst.
    du hast zb eine sqlite-datenbank und an die sendest du dann eine query und erwartest genau 1 resultat. es macht keinen sinn quasi alle resultate beim start der app in den speicher zu laden.

    Er meint das Migrieren der SQlite-Datei in CoreData


    warum sollte er das tun?
    Naja ich habe die Geodaten, mit denen ich arbeite in Form einer Datei (csv z.B.). Irgendwie muss ich die Daten doch in meine DB bringen, um diese dann abfragen zu können. Da ich nicht ein paar k Datensätze von Hand abschreiben möchte, wollte ich die Datei parsen und in SQLite "importieren". Der Nachteil, den ich da sehe ist, dass jeder, der die App nutzt auch auf diese Geodaten-Datei zugreifen können muss (zumindest beim ersten Start der App).
    Welche andere Möglichkeit würde es denn geben?
  • urindanger schrieb:

    gritsch schrieb:

    matz schrieb:

    urindanger schrieb:

    gritsch schrieb:

    urindanger schrieb:

    Wie stelle ich denn sicher, dass die Daten nur einmalig beim ersten Starten der App eingelesen werden?


    genau das sollst du ja nicht.
    du willst den batzen daten nicht in den speicher laden sondern nur bei gebraucht genau die eine row mit den infos (eben das resultat einer abfrage)
    Das verstehe ich nicht so ganz. Klar will ich das Resultat einer Abfrage. Aber bevor ich eine Anfrage an die DB machen kann, muss ich doch zunächst die Daten aus der Datei dort reinbringen. Sonst könnte ich doch direkt die Infos aus der Datei ziehen, ohne eine DB aufzubauen?


    verstehe nicht was du mit "der datei" meinst.
    du hast zb eine sqlite-datenbank und an die sendest du dann eine query und erwartest genau 1 resultat. es macht keinen sinn quasi alle resultate beim start der app in den speicher zu laden.

    Er meint das Migrieren der SQlite-Datei in CoreData


    warum sollte er das tun?
    Naja ich habe die Geodaten, mit denen ich arbeite in Form einer Datei (csv z.B.). Irgendwie muss ich die Daten doch in meine DB bringen, um diese dann abfragen zu können. Da ich nicht ein paar k Datensätze von Hand abschreiben möchte, wollte ich die Datei parsen und in SQLite "importieren". Der Nachteil, den ich da sehe ist, dass jeder, der die App nutzt auch auf diese Geodaten-Datei zugreifen können muss (zumindest beim ersten Start der App).
    Welche andere Möglichkeit würde es denn geben?


    ja csv kann man doch recht einfach in eine SQLite-DB importieren.

    dieses file legst du dann in dein bundle und führst dagegen dann die queries aus.
  • gritsch schrieb:

    ja csv kann man doch recht einfach in eine SQLite-DB importieren.

    dieses file legst du dann in dein bundle und führst dagegen dann die queries aus.
    Ok ich wusste nicht, was es da überhaupt für Möglichkeiten gibt. Sowas würde ja genau zu dem passen, was ich machen will. Gibt es schon fertige Tools um sqlite dateien zu erstellen bzw. csv in sqlite umzuwandeln?
  • urindanger schrieb:

    gritsch schrieb:

    ja csv kann man doch recht einfach in eine SQLite-DB importieren.

    dieses file legst du dann in dein bundle und führst dagegen dann die queries aus.
    Ok ich wusste nicht, was es da überhaupt für Möglichkeiten gibt. Sowas würde ja genau zu dem passen, was ich machen will. Gibt es schon fertige Tools um sqlite dateien zu erstellen bzw. csv in sqlite umzuwandeln?


    bemüh doch einfach google. da gibt es siche rmassig tools um das zu convertieren.
    erste ergebins war bei mir gleich convertcsvtomysql.com/
    ist ja egal ob da MySQL steht denn die reinen befehle sind sicherlich kompatibel ;)
  • Danke erstmal für die Antworten.

    Ich habe das Tool "SQL Server To SQLite DB Converter" aus folgender Liste genutzt: sqlite.org/cvstrac/wiki/wiki?p=ConverterTools . Sehr einfach zu bedienen und funktioniert fehlerfrei.

    Ich habe meine DB-Datei bei den Supporting Files, bzw. im MainBundle. Ich kann ja theoretisch dort auf die Datei zugreifen. Gibt es einen Grund die Datei beim ersten Start in den Documents Ordner zu schieben (bzw. zu kopieren?). Ist mir beim googlen öfter mal unter gekommen.
  • urindanger schrieb:

    Danke erstmal für die Antworten.

    Ich habe das Tool "SQL Server To SQLite DB Converter" aus folgender Liste genutzt: sqlite.org/cvstrac/wiki/wiki?p=ConverterTools . Sehr einfach zu bedienen und funktioniert fehlerfrei.

    Ich habe meine DB-Datei bei den Supporting Files, bzw. im MainBundle. Ich kann ja theoretisch dort auf die Datei zugreifen. Gibt es einen Grund die Datei beim ersten Start in den Documents Ordner zu schieben (bzw. zu kopieren?). Ist mir beim googlen öfter mal unter gekommen.


    nein, brauchst du nicht dort hin kopieren solange du nur lesend darauf zugreifst. schreiben kannst du jedoch nicht!
  • ok... jetzt kommt folgende Frage auf: Wie ich herausgefunden habe, kann ich über core-data nicht einfach Datanbankabfragen machen, wie bei einer normalen Datenbank. Also muss ich entweder meine SQLite DB in Core-Data überführen bzw. importieren (d.h. wohl ein DataModel erstellen und die Daten aus meiner Datei irgendwie dort reinbringen) oder mit einem Framework arbeiten. Zur zweiten Möglichkeit habe ich das FMDB Framework gefunden, dass scheinbar nur gelobt wird.
    - Was wäre denn die elegantere, bzw. stabilere Lösung? Ist FMDB zuverlässig?
    - Bei FMDB kann man wie ich gesehen habe "normale" sql-anfragen machen (Z.B. Summierung von Werten; Group usw...). Für Core Data habe ich sowas auf anhieb nicht gefunden, nur die Rückgabe von Attributen mittels fetch. Also ohne irgendwelche Bedingungen, die man sonst in SQL festlegen kann.

    Was würde sich denn besser eignen für ein Mapping von PLZs und Koordinaten, so wie ich es vor habe?