2012-04-03 4 views
4

Können mir Leute Beispiele nennen, warum sie CoreData in einer Anwendung verwenden?Gibt es einen Wert bei der Verwendung von Core-Daten für iPhone-Apps?

Ich frage dies, weil die meisten Apps nur Clients zu einem zentralen Server sind, wo eine API von einer Art gibt Ihnen die Informationen, die Sie benötigen.

In meinem Fall Ich schreibe eine Zeiterfassungsanwendung für einen Web-App, die eine API hat und ich diskutieren, ob es ein Wert gibt die Datenstruktur auf meinem Server in Kerndaten in der Replikation (SQLite)

zB

Projekt hat viele Zeiterfassungen Mitarbeiter viele Zeiterfassungen haben

Es scheint mir, dass ich bei jedem Aufruf für Listen von Projekten oder bestehende Zeiterfassungen zum Beispiel an die API nur anschließen.

Ich realisiere für eine Art von Offline-Modus können Sie lokal in Core-Daten speichern, aber dies schafft viel mehr Probleme, weil Sie jetzt ein großes Problem mit der Synchronisierung dieser Daten zurück auf den Webserver haben, wenn Sie wieder Verbindung erhalten. Das für eine Arbeitszeittabelle ausgewählte Projekt existiert nicht mehr.

Kann ein erfahrener Entwickler etwas über die Erfahrungen berichten, wann Kerndaten ein Best-Practice-Ansatz sind?

EDIT

Mir ist klar, natürlich Wert gibt es scheint lokale Persistenz bei der Speicherung, aber der Schlüsselwert der Benutzereinstellungen die meisten Anwendungen abdecken ich mir vorstellen kann.

Antwort

6

Sie sollten nicht einfach als eine SQLite-Datenbank von Coredata denken. Es ist nicht nur eine SQLite-Datenbank. Sicher, SQLite ist eine Option, aber es gibt auch andere Optionen, wie In-Memory und ab iOS5 eine ganze Reihe von benutzerdefinierten Datenspeichern. Der größte Vorteil von CoreData ist offensichtlich die Persistenz. Aber selbst wenn Sie einen In-Memory-Datenspeicher verwenden, profitieren Sie von einem sehr gut strukturierten Objekt-Graphen, und das gesamte Heavy-Lifting hinsichtlich des Herausziehens von Informationen oder des Einbringens von Informationen in den Datenspeicher wird von CoreData for gehandhabt Sie, ohne dass Sie sich unbedingt damit befassen müssen, was diesen Datenspeicher unterstützt. Sicher, heute interessieren Sie sich nicht so sehr für Persistenz, also könnten Sie einen In-Memory-Datenspeicher verwenden. Was passiert, wenn Sie sich morgen, in einem Monat oder in einem Jahr entscheiden, ein Feature hinzuzufügen, das wirklich von Persistenz profitieren würde? Mit CoreData ändern Sie einfach oder fügen Sie einen persistenten Datenspeicher hinzu, und alle Ihre Methoden, um Informationen zu erhalten oder zu ändern, bleiben unverändert. Der Aufwand für diese Art der Hinzufügung ist minimal im Vergleich zu dem Versuch, direkt auf SQLite oder einen anderen Datenspeicher zuzugreifen. IMHO, das ist der größte Vorteil: Abstraktion. Und im Wesentlichen ist Abstraktion eine der mächtigsten Dinge hinter OOP. Zugegeben, das Erstellen des Datenmodells nur für In-Memory-Speicher kann für Ihre App zu viel Aufwand sein, je nachdem, wie stark die App ist. Aber als Nebenbemerkung möchten Sie vielleicht überlegen, was schneller ist: Informationen von Ihrem Webdienst jedes Mal anfordern, wenn Sie eine Aktion ausführen möchten, oder die Informationen einmal anfordern, im Speicher ablegen und für diesen gespeicherten Wert handeln der Rest der Sitzung. Ein speicherinterner Datenspeicher würde über diese bestimmte Sitzung hinaus nicht bestehen.

Zusätzlich mit Coredata erhalten Sie viele andere tolle Features wie das Speichern, Abrufen und Undo-Redo.

+0

Können Sie mir ein Beispiel geben, wann Sie es benutzt haben? Was hat die App gemacht? –

+0

Ich habe es für beide Szenarien verwendet. In dem Szenario, in dem ich Daten aus dem Internet herunterzog, würde ich die Daten einfach einmal analysieren und analysieren und NSManagedObjects für diese Dinge erstellen. Dann könnte ich das aber in der App weitergeben und wann immer ich wollte. Ich habe einen persistenten SQLite-Speicher verwendet, weil ich, obwohl es sich um Webdaten handelte, nicht wollte, dass ein Benutzer mit dem Internet verbunden ist, damit es eine nützliche App ist. Ich habe den Web-Feed nach Änderungen abgefragt und CD würde nur die Änderungen (Deltas), nicht das ganze Objekt, übernehmen. – jmstone617

+1

+1 Möchten hinzufügen: Core Data gewährleistet auch die Konsistenz Ihres Objektgraphen –

1

Es ist ideal, wenn Sie Daten lokal auf dem Telefon speichern möchten.

Im Ernst, wenn Sie nicht sehen, dass es für Ihre Zeiterfassung App brauchen, dann machen Sie sich keine Sorgen darüber und verwenden Sie es nicht.

Die Synchronisierungsprobleme, die Sie mit einem "Offline" -Modus haben würden, würden in Ihrem Design Ihrer App ausführlich beschrieben. Zum Beispiel - erlauben Sie nicht, dass Projekte gelöscht werden. Warum würdest du? Möchten Sie nicht in die Vergangenheit zurückgehen und sich frühere Daten für bestimmte Projekte ansehen? Verwenden Sie stattdessen eine Markierung im Projekt, um sie als inaktiv zu markieren, und ein Datum/eine Uhrzeit, zu der sie inaktiviert wurde. Wenn die Daten, die vom Gerät synchronisiert werden, für dieses Projekt bestimmt sind und vor dem Datum/der Uhrzeit liegen, an dem/denen es als inaktiv markiert wurde, können Sie die Synchronisierung durchführen. Andernfalls wird eine Nachricht angezeigt und der Benutzer muss sie sortieren.

+0

In dem Web-App können Sie keine Projekte löschen, die Zeiterfassungen mit ihnen verbunden haben, aber .. wenn sie dann nicht tun können Sie .. Rand Fall aber nach wie vor. –

+0

Können Sie mir ein Beispiel dafür geben, wann Sie Kerndaten für eine App verwendet haben und diese benötigt wurde? –

+1

Ändern Sie einfach die Serverseite, damit sie nicht gelöscht werden. Was passiert, wenn Sie etwas in der Web-App löschen und jemand Daten eingibt und auf "Speichern" klickt, nachdem jemand auf "Löschen" im Projekt geklickt hat? Sie werden diesen Fall trotzdem behandeln.Was ist mit der Verwendung von Coredata zum Zwischenspeichern der Projekte und anderer Daten lokal auf dem Mobilteil, so dass Sie nicht ständig auf Ihrem Server hin und her gehen. Hört sich für mich so an, als wollten Sie nur einen Wrapper um eine Webansicht schreiben, um Ihre Webapp anzuzeigen. Sie müssen über die Benutzererfahrung in einer nativen App für mobile Geräte nachdenken. –

0

Es hängt ausschließlich vom Design Ihrer Anwendung ab, ob Sie Daten lokal speichern müssen oder nicht, ob es sich um ein echtes Problem handelt oder um einen dünnen GUI-Client um Ihren Web-Service. Abgesehen von dem "Offline" -Modus ist der andere Grund, Serverdaten auf der Client-Seite zwischenzuspeichern, die Verkehrslast von Ihrem Server zu nehmen. Denken Sie nur daran, was es für Ihren Server bedeutet, jedes Mal die gesamten Zeiterfassungsdaten an den Client oder nur die Änderungen zu senden. Ja, es bedeutet mehr Umsetzung auf beiden Seiten, aber in einigen Fällen hat es ernsthafte Vorteile.

EDIT: Beispiel hinzugefügt

Sie haben 1000 Datensätze pro Benutzer in Ihrer Zeiterfassungsanwendung und ein Datensatz ist ca. 1 kByte. In diesem Fall muss jedes Mal, wenn ein Benutzer die Anwendung startet, 1 MB Daten von Ihrem Server abgerufen werden. Wenn Sie die Daten lokal zwischenspeichern, kann der Server Ihnen sagen, dass zwei Datensätze seit dem letzten Update aktualisiert wurden. Sie müssen also nur 2 KByte herunterladen. Jetzt sollten Sie dies für mehrere zehntausend Benutzer skalieren und Sie werden sofort den Unterschied der Serverbandbreite und CPU-Auslastung bemerken.

+0

Können Sie mir ein Beispiel geben? –

+0

Ich habe ein Beispiel in der Antwort hinzugefügt. – MrTJ

3

Es gibt grundsätzlich zwei Arten von Apps. Diejenigen, die Ihnen lokale Funktionalität bieten (Spiele, professionelle Anwendungen, Navigationssysteme ...) und solche, die Zugriff auf einen Remote-Service gewähren.

Ihre Anwendung scheint in der zweiten Kategorie zu sein. Wenn Sie auf Remote-Dienste zugreifen, möchten Ihre Benutzer auf neue oder Echtzeitdaten zugreifen (Sie möchten keine 2 Wochen alten Facebook-Posts lesen), aber in manchen Fällen ist lokales Caching sinnvoll (z. B. das Lesen Ihrer Mails) im Zug mit instabilem Netz).

Ich nehme an, dass der Wert für den Zugriff auf zwischengespeicherte Einträge, wenn sie nicht mit einem Netzwerk verbunden sind, für Ihre Kunden (intern oder extern) relativ gering ist, verglichen mit der Wichtigkeit des Zugriffs auf Echtzeitdaten. Daher ist lokaler Speicher möglicherweise gar nicht notwendig.

Wenn Sie in Ihrem Zeitplan Hunderte von Einträgen, „normal“ Serialisierung (NSCoding-Protokoll) möglicherweise nicht genug. Wenn Sie nur auf einige "Dashboard-Daten" zugreifen, können Sie mit einem einfachen Request/Response-Caching (NSURLCache kann viele Dinge tun ...) auskommen.

Core Data macht mehr Sinn machen, wenn Sie komplexe Datenstrukturen aufweisen, die mit einem Server synchronisiert werden sollen. Dies fügt Ihrem Projekt eine Menge Synchronisierungslogik hinzu sowie die Komplexität der Kerndatenintegration (Nebenläufigkeit, Thread-Sicherheit, In-App-Konflikte ...).

Wenn Sie eine "Client" -App mit einer servergesteuerten Benutzererfahrung erstellen möchten, ist lokaler Speicher überhaupt nicht notwendig, daher ist mein Vorschlag: Behalten Sie es so einfach wie möglich, es sei denn, es besteht Bedarf an Offline-Speicher.

+2

CoreData ist nicht nur über Datenpersistenz. Wie ich bereits sagte, könnte er einen In-Memory-Datenspeicher verwenden, um einfach die anderen Vorteile von CoreData zu erhalten, z. B. Delta-Speichern, Löschen und Undo/Redo. Wenn ich meinen Arbeitszeitnachweis ändere und diese Änderung dann rückgängig machen möchte, ist es unglaublich einfach, CoreData zu verwenden, als zu versuchen, diese Logik selbst zu schreiben. – jmstone617

+0

Natürlich sind Kerndaten mehr als Persistenz, aber mein Punkt ist mehr darüber, wie und wo der Benutzer mit den Daten interagiert. Wenn Sie Web-Services für jede Bearbeitung/Wiederholung haben und keine Bearbeitungen zulassen möchten, die der Server nicht verarbeiten kann, ist jede Form der lokalen Datenbearbeitung ein großer Aufwand. Wenn es sinnvoll ist, mit lokalen Daten zu arbeiten, Kerndaten sind sinnvoll (zB mit RestKit). Wenn Sie nur einfache Dinge für die Anzeige "speichern" wollen (keine oder wenig Manipulation), dann sind sogar Kerndaten selbst ein Overhead –

Verwandte Themen