Das Problem:
Ich benötige eine geräteunabhängige (z. B. HTML5) Lösung zum Speichern und Abfragen von mehr als 250.000 Datenzeilen offline auf einem Gerät vom Typ Telefon oder Tablet (z. B. iOS / Android). Die Idee ist, dass ich Leute habe, die in abgelegenen Gebieten ohne zellulare Datenverbindung arbeiten und Abfragen zu diesen Daten ausführen und sie offline bearbeiten müssen. Teilweise wird es geostandortbasiert sein. Wenn sich also Assets in dem Gebiet befinden, in dem sie sich befinden (verwendet GPS), werden diese Assets angezeigt und können bearbeitet werden. Wenn sie ins Büro zurückkehren, können sie die Daten wieder mit dem Office-Server synchronisieren.
Der Grund, warum ich mich dem aus Sicht des Webstandards nähere, besteht im Grunde darin, Geld und Zeit zu sparen, indem ich es einmal in HTML5 schreibe und es dann plattformübergreifend funktioniert, anstatt es zweimal in Objective C und Java zu schreiben. Auch wenn Sie etwas schreiben, das plattformunabhängig ist, sind Sie nicht eingesperrt und gehen nicht mit dem Schiff unter, wenn alle zu einem neueren wechseln. Wir hatten eine ähnliche App für Windows Mobile 5 geschrieben, jetzt ist sie nutzlos, da diese Plattform tot ist.
Die Offline-Datenbank auf dem Gerät muss sein:
- schnell (Antworten unter 2 Sekunden)
- Führen Sie möglicherweise Verknüpfungen durch und haben Sie Beziehungen zu anderen Tabellen, die die Datenbank abfragen können
- Wählen Sie Daten innerhalb eines bestimmten Bereichs oder Kriterien aus, z. B. durch x & y-Koordinate basierend auf dem GPS-Messwert.
Optionen:
Lokaler HTML5-Speicher:
Gut für kleine Datenmengen <5.000 Schlüssel / Werte. Sie können sogar Arrays / Objekte darin speichern, wenn Sie sie in JSON konvertieren.
Nachteile:
- Bei mehr als 10.000 Zeilen verlangsamt der Browser selbst auf einem High-End-Computer das Crawlen.
- Es können keine komplexen Abfragen an den Daten durchgeführt werden, um die gewünschten Daten abzurufen, da Sie den gesamten Speicher durchlaufen und manuell danach suchen müssen.
- Einschränkungen mit der Speichermenge, die gespeichert werden kann
Web SQL-Datenbank:
- Entspricht den Anforderungen.
- Schnelle Ausführung einer Abfrage in 250.000 Zeilen (1-2 Sekunden)
- Kann komplexe Abfragen, Verknüpfungen usw. Erstellen
- Unterstützt von Safari, Android und Opera, funktioniert dies auch auf iOS- und Android-Geräten
Nachteile:
- Ab November 2010 veraltet
- Sicherheitslücke bei verzeichnisübergreifenden Angriffen. Kein wirkliches Problem, da wir kein Shared Hosting betreiben
IndexedDB:
Schlüssel- / Wertobjektspeicher ähnlich dem lokalen Speicher, außer mit Indizes.
Nachteile:
- Langsame Ausführung einer Abfrage in 200.000 Zeilen (15 bis 18 Sekunden)
- Komplexe Abfragen können nicht ausgeführt werden
- Verknüpfungen mit anderen Tabellen sind nicht möglich
- Wird von Haupttelefon- oder Tablet-Geräten, z. B. iPad / Android, nicht unterstützt
- Standard nicht vollständig
Dies lässt die einzige Möglichkeit, die veraltete Web SQL-Methode zu implementieren, die möglicherweise nur für ein weiteres Jahr oder so funktioniert. IndexedDB und lokaler Speicher sind derzeit unbrauchbar.
Ich bin mir nicht sicher, wie Mozilla und Microsoft den Standard der Web SQL-Datenbank veraltet haben und warum das W3C dies zulässt. Angeblich haben sie einen Anteil von 77% am Desktop-Browser-Markt. Auf fortschrittlichen Mobilgeräten haben Mozilla und Microsoft nahezu keinen Einfluss, da Safari, Opera und Android über 90% des Marktanteils haben . Wie Mozilla & Microsoft bestimmen können, welcher Standard auf dem Mobilfunkmarkt verwendet werden soll, auf dem am wahrscheinlichsten Offline-Speicher verwendet wird, macht keinen Sinn.
In den Kommentaren von Mozilla, warum sie stattdessen mit IndexedDB arbeiten wollten, geht es hauptsächlich um 'Entwicklerästhetik' und sie mögen die Idee, SQL in JavaScript auszuführen, nicht. Ich kaufe es nicht.
Derzeit ist der vorgeschlagene Standard minderwertig und eine äußerst grundlegende NoSQL-Implementierung, die langsam ist und nicht einmal die erweiterten Funktionen unterstützt, die Benutzer in einer Datenbank benötigen. Es gibt eine Menge Boilerplate-Code, um die Datenbank einzurichten und Daten herauszuholen, aber sie behaupten, dass die Leute darüber einige nette Abstraktionsbibliotheken schreiben werden, die erweiterte Funktionen bieten. Ab Oktober 2011 sind sie nirgends zu sehen.
Sie haben den vorhandenen Web SQL-Standard, der tatsächlich funktioniert und in den wichtigsten Browsern für Mobilgeräte / Tablets implementiert ist, abgelehnt. Während ihr "neuer" und "besserer" Standard in den großen mobilen Browsern nicht verfügbar ist.
Was sollen wir als Entwickler für die nächsten 3-5 Jahre verwenden, wenn die IndexedDB-Spezifikation möglicherweise standardisiert wird, mehr Funktionen hat, in den wichtigsten Browsern für Mobilgeräte / Tablets implementiert ist und es einige nette Bibliotheken gibt, die die Dinge einfacher machen?
Das W3C sollte den Standard der Web SQL-Datenbank parallel ausführen und nur die Probleme beheben. Es unterstützt bereits die wichtigsten mobilen Plattformen und funktioniert recht gut. Die Tatsache, dass Mozilla und Microsoft als die beiden Player mit der höchsten Desktop-Browser-Freigabe diesen Standard ausrangieren konnten, ist ziemlich zweifelhaft und könnte als Versuch angesehen werden, den Fortschritt auf den mobilen Webplattformen zu behindern, bis sie aufholen und anbieten können konkurrierende Lösungen gegen iOS / Safari und Android.
Zusammenfassend hat jemand eine Lösung für mein Problem, die für iOS / Android für Telefon / Tablet-Geräte funktioniert. Möglicherweise eine nette Wrapper-API, die mehrere Datenbankimplementierungen im Hintergrund mit Abfragefunktion verwenden kann und mit der Sie auswählen können, welche Datenbank Priorität hat. Ich habe Dinge wie Liegestühle gesehen, aber ich bin mir ziemlich sicher, dass Sie standardmäßig nur lokalen Speicher verwenden können und auf die anderen zurückgreifen. Ich denke, ich würde lieber Web SQL (standardmäßig) als die langsameren Optionen verwenden.
Jede Hilfe für eine Lösung sehr geschätzt, danke!
Antworten:
Ich würde empfehlen, die JayData- Bibliothek zu besuchen , die genau den Zweck hat, eine speicherunabhängige Datenzugriffsschicht für mobile Geräte zu erstellen. JayData bietet eine Abstraktionsschicht mit Unterstützung für JavaScript Language Query (JSLQ) und JavaScript CRUD und lässt Sie mit verschiedenen Offline- und Online-Datenspeichertypen genauso arbeiten. JayData unterstützt den Umgang mit komplexen Entitäten und auch Entitätsbeziehungen entweder lokal oder remote.
Zum Zeitpunkt des Schreibens unterstützt JayData die folgenden Speicher oder Protokolle: webSQL (sqLite) / IndexedDB / OData / YQL / FBQL.
Ihr spezielles Problem mit verschiedenen Systemen, die unterschiedliche Speicher-Engines bereitstellen, kann mit der Provider-Fallback-Funktion von JayData leicht behoben werden: Es verwendet jede Speicherschicht, die es finden kann, und bietet dennoch dieselbe API für den Verbrauchercode.
In Bezug auf WebSQL, das bis 2012 veraltet ist: Zum Zeitpunkt des Schreibens ist es WebSQL, das immer noch eine Geräteabdeckung von 95% aufweist, einschließlich Samsung SmartTV und Amazon Kindle. Schauen Sie sich kindle an, das WebSQL-Unit-Tests mit JayData ausführt .
quelle
Ich würde CouchBase Lite auschecken. Es ist eine nahezu voll funktionsfähige Implementierung von CouchDB , die auf Android und iOS ausgeführt wird.
iOS
Android
Wenn Sie Ihre App in etwas wie PhoneGap verpackt haben, können Sie native HTML 5-Apps für beide Plattformen erstellen und müssen nur ein kleines Stück Android / iOS-spezifischer Programmierung durchführen, um CouchDB zu implementieren.
Vorteile:
Nachteile:
quelle
Ich habe weiter recherchiert und nach einer Lösung für mein eigenes Projekt gesucht. Es sieht so aus, als ob diese Bibliothek vielversprechend ist: http://nparashuram.com/IndexedDBShim/
Es ermöglicht die Verwendung der IndexedDB-API mit WebSQL hinter den Kulissen.
Die Tests bestehen auf dem neuesten iPad, iPhone 5 und Android 4.2.2.
Hoffe das hilft jemandem.
quelle
Ich würde dir sagen, dass du Corona dafür verwenden sollst . Es handelt sich um eine private Plattform für mobile Anwendungen, die SQLite unterstützt.
Vorteile
Nachteile
Ich füge hier ein, was sie dazu sagen:
quelle
"Ich habe Dinge wie einen Liegestuhl gesehen, aber ich bin mir ziemlich sicher, dass Sie standardmäßig nur lokalen Speicher verwenden können und auf die anderen zurückgreifen. Ich denke, ich würde lieber Web SQL (standardmäßig) als die langsameren Optionen verwenden . "
Dies ist konfigurierbar. Jeder der 'Adapter' für Speicher-Engines ist eigenständig. Sie können einen Adapter an den Lawnchair-Konstruktor übergeben oder alternativ die Reihenfolge ändern, in der er auf andere Speicheroptionen zurückgreift, indem Sie die Javascript-Dateien anders verketten, wenn Erstellen der Bibliothek. zB für indexed-db, dann auf sqlite zurückgreifen und dann sqlite schalten:
git clone https://github.com/brianleroux/lawnchair.git cd lawnchair cat src/Lawnchair.js src/adapters/indexed-db.js src/adapters/webkit-sqlite.js src/adapters/gears-sqlite.js > my_lawnchair.js
Natürlich können Sie, wie die anderen Antworten andeuten, Ihr HTML5 mithilfe von Phonegap usw. in eine native App einbinden. Dann haben Sie viele Optionen. Wenn Sie sich jedoch an Webstandards halten möchten, ist dies möglicherweise ein guter Weg, bis Wir haben eine breite Akzeptanz von IndexedDB.
quelle
Warum nicht eine einfache Speicher-Engine in Javascript schreiben (die den "standardbasierten" Teil abdeckt)? Anscheinend brauchen Sie nichts Besonderes, also sollte es nicht zu viel Mühe kosten, bis es funktioniert.
Ich würde folgendes tun:
Diese Lösung ist nur möglich, wenn die Datenbank einfach genug ist. Aber ich denke, es könnte funktionieren - Javascript-Unterstützung ist auf Mobilgeräten gut.
Als Inspiration dient hier eine Btree + -Implementierung in Javascript.
Zum Lesen der lokalen Dateien benötigen Sie die Datei-API , mit der Sie auf lokale Dateien zugreifen können . Es wird in den meisten modernen Browsern unterstützt, sogar in Safari 6 . Ich konnte jedoch nicht feststellen, ob aktuelle iPhone-Browser diese API unterstützen.
quelle
Es lohnt sich, meine Open-Source-Bibliothek https://bitbucket.org/ytkyaw/ydn-db/wiki/Home zu besuchen
Als NoSQL-Bibliothek ist der Beitritt manuell, aber nicht unmöglich. In der Bibliothek sind bereits wichtige Verknüpfungsalgorithmen integriert.
quelle