Search for:

Alles über Proto DataStore. In diesem Beitrag werden wir etwas über Proto lernen… | von Simona Stojanovic Android-Entwickler Januar 2022

Das erfahren wir in diesem Beitrag Proto-DataStoreeiner von zwei DataStore-Implementierungen. Wir werden darüber sprechen, wie erstellen, Daten lesen und schreiben und Ausnahmen behandelnum die Szenarien besser zu verstehen, die Proto zu einer guten Wahl machen.

Proto DataStore verwendet typisierte Objekte, die von unterstützt werden Protokollpufferkleinere Datensätze beim Bereitstellen zu speichern Typ Sicherheit. Dadurch entfällt die Notwendigkeit, Schlüssel/Wert-Paare zu verwenden strukturell anders von seinem Vorgänger und seine zugehörige Implementierung, DataStore-Einstellungen. Doch das ist noch nicht alles – berichtet DataStore viele weitere Verbesserungen fertig . Melden Sie sich schnell bei uns zurück erster Beitrag in Folge und schauen Sie sich den detaillierten Vergleich an, den wir dort gemacht haben. Wir werden uns das Folgende ansehen wie nur wenn nicht anders angegeben.

zusammenfassen:

  • Bietet ein vollständig asynchrone API zum Herunterladen und Speichern von Daten mit der Kraft von Kotlin Korutina
  • Es bietet keine gebrauchsfertige synchrone Unterstützung – vermeidet direkt jegliche Arbeit, die den UI-Thread blockiert
  • Es stützt sich auf den internen Fehlersignalisierungsmechanismus von Flow, sodass Sie sicher arbeiten können Ausnahmen abfangen und verarbeiten beim Lesen oder Schreiben von Daten
  • Verarbeitet sicher Datenaktualisierungen in Atomare Read-Modify-Write-Operationstark zur Verfügung stellen SÄURE Garantien
  • Erlaubt einfache und einfache Datenmigration
  • Müssen vollständige Sicherheit und Ihre Daten erfordern die Arbeit mit mehr komplexe Klassen, wie Aufzählungen oder Listen? Dies ist mit nicht möglich Einstellungenalso wähle Proto stattdessen

Um Proto DataStore nutzen zu können, müssen Sie sich kennenlernen Protokollpuffer – sprachneutraler, plattformneutraler Mechanismus für Serialisierung strukturierter Daten. Es ist schneller, kleiner, einfacher und eindeutiger als XML und leichter zu lesen als andere ähnliche Datenformate.

Sie definieren ein Schema aus wie Sie Ihre Daten strukturiert haben möchten und geben Sie Optionen an, z. B. welche Sprache zum Generieren des Codes verwendet werden soll. Der Compiler generiert dann Klassen nach Ihren Vorgaben. Dadurch können Sie problemlos strukturierte Daten schreiben und lesen zu und von verschiedenen Datenströmen, Austausch zwischen verschiedenen Plattformen, Verwendung mehrerer verschiedener Sprachen, z. Kotlin.

Beispielschema einiger Daten ua Datei:

So verwenden Sie den generierten Kotlin-Code zum Erstellen Ihres Datenmodells:

Oder Sie können das neu Angekündigte ausprobieren Kotlin DSL-Unterstützung für Protokollpuffer für eine idiomatischere Art, Ihr Datenmodell zu erstellen:

Etwas mehr Zeit in das Erlernen dieses neuen Serialisierungsmechanismus zu investieren, lohnt sich auf jeden Fall, denn er bringt Typsicherheit, verbesserte Lesbarkeit und allgemeine Einfachheit des Codes.

Schauen wir uns jetzt etwas Code an und lernen, wie Proto funktioniert.

Wir werden verwenden Proto-DataStore Codelab-Muster. Wenn Sie an einem praktischeren Ansatz zur Implementierung interessiert sind, empfehlen wir Ihnen wirklich, es durchzugehen Arbeiten Sie mit Proto DataStore Codelab selbstständig.

Diese Beispielanwendung zeigt eine Liste von Aufgaben an, und der Benutzer kann sie nach ihrem abgeschlossenen Status filtern oder nach Priorität und Frist sortieren. Wir möchten ihre Auswahl speichern boolean, um abgeschlossene Aufgaben anzuzeigen ia Aufzählung sortieren Proto.

Wir werden zunächst Proto-Abhängigkeiten und einige der grundlegenden Protobuff-Einstellungen zu Ihrem Modul hinzufügen . Wenn Sie an einer fortgeschritteneren Anpassung der Protobuffs-Kompilation interessiert sind, werfen Sie einen Blick darauf Protobuf-Plugin für Gradle-Notizen:

💡 Kurzer Tipp – Wenn Sie Ihre Konstruktion minimieren möchten, fügen Sie unbedingt eine zusätzliche Regel hinzu Datei, um zu verhindern, dass Ihre Felder gelöscht werden:

Unsere Reise mit Proto beginnt mit der Definition Ihrer Struktur persistente Daten u Datei. Betrachten Sie es als lesbares Schema für dich u.a Entwurf für den Compiler. Wir werden unsere nennen und füge es hinzu Verzeichnis.

Begleitet Protobuf-SprachführerWir werden dieser Datei ein hinzufügen Nachricht für jede Datenstruktur wir wollen serialisieren und dann a spezifizieren Name ia Typ für jedes Feld in der Nachricht. Um dies einfacher zu visualisieren, schauen wir uns sowohl die Kotlin-Datenklasse als auch das entsprechende Protobuff-Schema an.

– Kotlin-Datenklasse:

planen:

Wenn Sie noch nie Protobuffs verwendet haben, interessieren Sie sich vielleicht für die ersten Zeilen des Schemas. Lassen Sie uns sie aufschlüsseln:

  • – zeigt an zu verwenden Syntax
  • – eine Dateioption, die angibt Paketerklärung für Ihre generierten Klassen, was dazu beiträgt, dies zu verhindern Namenskonflikte zwischen verschiedenen Projekten
  • – eine Dateioption, die angibt, ob nur eine einzelne Datei mit verschachtelten Unterklassen werden hierfür generiert (wenn auf false gesetzt) ​​oder if getrennte Dateien wird für jeden Nachrichtentyp der obersten Ebene generiert (wenn auf wahr gesetzt); es ist standardmäßig falsch

Das Folgende ist die Definition unserer Botschaft. Eine Nachricht ist ein Aggregat, das enthält eine Reihe von typisierten Feldern. Viele einfache Standarddatentypen sind als Feldtypen verfügbar, einschließlich , , doppelt i . Sie können Ihre Nachrichten auch mit weiter strukturieren andere Nachrichtentypen als Feldtypenwie wir mit .

Der , Die Markierungen auf jedem Element identifizieren das eindeutige “Tag”, das das Feld in der Binärcodierung verwendet – wie z. B. die Sortier-ID. Wenn Ihr Nachrichtentyp verwendet wird, müssen diese Nummern nicht geändert werden.

Wenn Sie den Protokollpuffer-Compiler auf einem ausführen Der Compiler generiert Code in der von Ihnen ausgewählten Sprache. In unserem speziellen Fall führt dies beim Start des Compilers zur Generierung Klasse, die in Ihrer Bewerbung enthalten ist … Verzeichnis:

💡 Schneller Tipp – Du kannst auch die neu angekündigten ausprobieren Kotlin DSL-Unterstützung für Protokollpuffer um eine idiomatischere Methode zum Erstellen Ihres Datenmodells zu verwenden.

Jetzt, wo wir haben wir müssen angeben Richtlinien wie Proto sie lesen und schreiben soll. Wir tun dies über den DataStore es bestimmt das endgültige Format Ihrer Daten wann es gespeichert wird und wie man richtig darauf zugreift. Dies erfordert das Überschreiben von:

  • – was zurückgegeben werden soll, wenn keine Daten vorhanden sind
  • – wie man die Speicheranzeige unseres Datenobjekts in ein für die Speicherung geeignetes Format umwandelt
  • – die Umkehrung des Obigen, wie man von einem Speicherformat in eine geeignete Speicheranzeige umwandelt

Um Ihren Code so sicher wie möglich zu machen, zu handhaben um unangenehme Überraschungen zu vermeiden, wenn die Datei aufgrund einer Formatbeschädigung nicht deserialisiert werden kann.

💡 Kurztipp – Wenn dein AS mal nichts finden kann in Verbindung gebracht, reinigen und erneuern Ihr Projekt, um mit der Generierung von Protobuff-Klassen zu beginnen.

Sie interagieren mit Proto über Instanzen . ist eine Schnittstelle, die bietet Zugriff auf dauerhafte Informationenin unserem Fall in der generierten Form .

Es wird empfohlen, zum Erstellen dieser Instanz einen Delegaten zu verwenden und Pass erforderlich ich Argumente:

verwendet, um a zu erstellen verwendet, um Daten zu speichern. Deshalb ist es so Der Delegierte ist a Kotlin-Eigenschaftserweiterung dessen Empfängertyp eine Instanz sein muss weil es benötigt wird, um eine Datei über zu erstellen . Vermeiden Sie die Verwendung dieser Datei außerhalb von Proto, da dies die Konsistenz Ihrer Daten beeinträchtigen würde.

U Delegierten können Sie ein weiteres optionales Argument weiterleiten – . Dieser Operator heißt, wenn a wurde vom Serialisierer ausgeworfen, als Daten können nicht deserialisiert werden. würde dann Proto anweisen, wie die beschädigten Daten zu ersetzen sind:

Sie sollten nicht mehr als eine DataStore-Instanz für eine bestimmte Datei erstellen, weil es die gesamte Funktionalität des DataStore ruinieren kann. Daher können Sie ein Delegate-Konstrukt einmal auf der obersten Ebene Ihrer Kotlin-Datei hinzufügen und es in der gesamten Anwendung verwenden, um es als zu übergeben Einzelling. Wie das mit einer Suchtspritze geht, sehen wir uns in späteren Beiträgen an.

Zum Auslesen gespeicherter Daten, u wir belichten a von . Dies ermöglicht ein effizientes Vorgehen der letzte erhaltene Zustand ich Sendungen bei jeder Änderung. Dies ist einer von größte Stärke von Proto – deins ‘s Werte kommen bereits in der generierten Form . Das heisst Sie müssen keine zusätzlichen Transformationen vornehmen von den gespeicherten Daten zum Kotlin-Datenklassenmodell, so wie Sie es tun würden oder :

Flow wird immer entweder einen Wert ausgeben oder verwerfen Sie die Ausnahme beim Versuch, von der Festplatte zu lesen. Wir werden uns in späteren Abschnitten mit der Behandlung von Ausnahmen befassen. Der DataStore stellt außerdem sicher, dass die Arbeit immer erledigt wird Ihr UI-Thread wird also nicht blockiert.

🚨 Erstellen Sie keine Cache-Repositories um den aktuellen Stand Ihrer Proto-Daten abzubilden. Damit erlischt die DataStore-Garantie für Datenkonsistenz. Wenn Sie eine Aufnahme Ihrer Daten ohne ein Abonnement für weitere Flow-Shows benötigen, verwenden Sie sie stattdessen :

Wir werden die Aussetzung verwenden, um Daten zu schreiben Funktion.

Lassen Sie es uns aufschlüsseln:

  • Schnittstelle – wird derzeit verwendet als konkrete Implementierung von Proto
  • – ein Suspend-Block, der verwendet wird, um bestimmte Änderungen an unseren permanenten T-Typ-Daten anzuwenden

Auch hier können Sie einen Unterschied bemerken die auf den Gebrauch angewiesen ist ich ähnlich ich als Standarddatenanzeige.

Jetzt können wir dies nutzen, um unsere zu ändern boolesch. Protokollpuffer vereinfachen dies ebenfallsEliminierung der Notwendigkeit einer manuellen Transformation in und aus Datenklassen:

Es gibt mehrere Schritte für die Analyse:

  • – er gewann Version von uns die es für Änderungen „freischaltet“.
  • – setzt einen neuen Wert
  • – Beendet den Update-Vorgang durch Konvertieren in

Die Datenaktualisierung erfolgt transaktional in einem Atomare Read-Modify-Write-Operation. Das bedeutet, dass es eine bestimmte Abfolge von Datenverarbeitungsvorgängen garantiert, während derer Daten für andere Threads gesperrt sind Konsistenz ich verhindert Rennbedingungen. Nur nach ich Corutins erfolgreich abgeschlossen, Daten werden dauerhaft auf der Festplatte gespeichert und Der Fluss wird die Aktualisierung widerspiegeln.

🚨 Beachten Sie, dass dies die einzige Möglichkeit ist, den Status des DataStore zu ändern. Wartung u Referenz und manuelle Mutation danach vervollständigt ändert die permanenten Daten nicht in Proto, also sollten Sie nicht versuchen zu modifizieren außen Block.

Wenn der Schreibvorgang aus irgendeinem Grund fehlschlägt, wird die Transaktion beendet und eine Ausnahme ausgelöst.

Wenn Sie es zuvor verwendet haben in Ihrer Anwendung und Sie Ihre Daten sicher an Proto übertragen möchten, können Sie verwenden . Dazu braucht es Kontext, Namen und Anweisungen, wie Sie Ihren eigenen umwandeln können Schlüssel/Wert-Paare für Innerhalb Parameter. Geben Sie dies weiter Parameter Delegierter für einfache Migration:

In diesem Beispiel durchlaufen wir den Konstruktionsprozess und seine Einstellung zu dem, was zuvor in der entsprechenden gespeichert wurde Schlüssel-Wert-Paar oder einfach auf NONE gesetzt.

wird dafür sorgen wurde gestartet vor einem möglichen Zugriff auf Daten im Datenspeicher. Das bedeutet Ihre Migration ihm muss es gelungen sein bevor der DataStore weitere Werte aussendet und bevor er mit neuen Datenänderungen beginnt. Sobald Sie erfolgreich migriert haben, können Sie die Verwendung sicher einstellen wie Schlüssel nur einmal migriert und dann ENTFERNT von .

Der akzeptiert die Liste . Wir werden in späteren Episoden sehen, wie wir dies für andere Arten von Datenmigrationen verwenden können. Wenn Sie nicht migrieren müssen, können Sie dies ignorieren, da es eine gibt Ursprünglich bereitgestellt schon.

Einer der Hauptvorteile von DataStore gegenüber ist seine ein geordneter Mechanismus zum Erfassen und Behandeln von Ausnahmen. Während wirft Parsing-Fehler als Laufzeitausnahmen aus und lässt Raum für unerwartete, nicht abgefangene Abstürze, DataStore wirft aus wenn beim Lesen/Schreiben von Daten ein Fehler auftritt.

Wir können dies sicher lösen, indem wir verwenden Flow- und Broadcast-Betreiber :

Oder mit dem einfachen Blockschreiben:

Wenn eine andere Art von Ausnahme ausgelöst wird, sollten Sie sie besser erneut auslösen.

Wir deckten ab Protokollpuffer ich Das Proto von DataStore Implementierung – wann und wie man damit Daten liest und schreibt, wie man mit Fehlern umgeht und wie man sie überwindet . Im nächsten und letzten Beitrag gehen wir noch einen Schritt weiter und sehen, wie sich der DataStore in Ihren einfügt Anwendungsarchitektur, wie man es mit Hilt injiziert und natürlich, wie man es testet. Seh dich später!

Alles über DataStore-Einstellungen. In diesem Beitrag werden wir uns ansehen… | von Simona Stojanovic Android-Entwickler Januar 2022

Wir werden uns diesen Beitrag ansehen DataStore-Einstellungeneiner von zwei Datenspeicher Implementierung. Wir werden weitermachen, wie erstellen, Daten lesen und schreiben und Ausnahmen behandelnund all das sollte Ihnen hoffentlich genügend Informationen liefern, um zu entscheiden, ob dies die richtige Wahl für Ihre Anwendung ist.

Einstellungen DataStore-Verwendungen Schlüssel/Wert-Paare um kleinere Datensätze zu speichern, ohne zuerst das Schema zu definieren. Dies könnte Sie daran erinnern SharedPreferences, aber nur in der Art und Weise, wie es Ihre Datenmodelle strukturiert. Es gibt ein verschiedene Vorteile bringt der DataStore durch seine SharedPreferences Vorgänger. Melden Sie sich schnell bei uns zurück vorherigen Post und schauen Sie sich den detaillierten Vergleich an, den wir dort gemacht haben. Wir werden uns das Folgende ansehen Preferences DataStore wie nur Preferenceswenn nicht anders angegeben.

Für eine kurze Zusammenfassung:

Lassen Sie uns nun in etwas Code eintauchen und lernen, wie Einstellungen implementiert werden sollten.

Wir werden verwenden DataStore-Einstellungen Codelab-Code. Wenn Sie an einem praktischeren Ansatz zur Implementierung interessiert sind, empfehlen wir Ihnen wirklich, es durchzugehen Arbeiten Sie mit DataStore-Einstellungen codelab allein.

Diese Beispielanwendung zeigt eine Liste von Aufgaben an, und der Benutzer kann sie nach ihrem abgeschlossenen Status filtern oder nach Priorität und Frist sortieren. Wir möchten ihre Auswahl speichern boolean für abgeschlossene Aufgaben ia Aufzählung sortieren im Datenspeicher.

Beginnen wir mit dem Hinzufügen der erforderlichen Abhängigkeiten:

💡 Ein kurzer Tipp: Wenn Sie Ihre Konstruktion minimieren möchten, fügen Sie Ihrer eigenen eine zusätzliche Regel hinzu proguard-rules.pro Datei, um zu verhindern, dass Ihre Felder gelöscht werden:

Sie interagieren mit den im DataStore gespeicherten Daten über eine Instanz DataStore<Preferences>. DataStore ist eine Schnittstelle, die den Zugriff auf dauerhafte Informationen gewährt. Einstellungen ist eine abstrakte Klasse ähnlich einer generischen Karte, die insbesondere in der Implementierung des Preferences DataStore verwendet wird, um Schlüssel-Wert-Paare Ihrer Daten zu verfolgen. Wir werden darüber sprechen MutablePreferences Unterklasse, wenn wir über das Schreiben von Daten sprechen.

Es wird empfohlen, zum Erstellen dieser Instanz einen Delegaten zu verwenden preferencesDataStore und Pass erforderlich name Streit. Dieser Delegierte ist a Kotlin-Eigenschaftserweiterung dessen Empfängertyp eine Instanz sein muss Contextanschließend für den Bau benötigt File Objekt, in dem DataStore Daten speichert:

Sie sollten nicht mehr als eine DataStore-Instanz für eine bestimmte Datei erstellen, weil es die gesamte Funktionalität des DataStore ruinieren kann. Daher können Sie ein Delegate-Konstrukt einmal auf der obersten Ebene Ihrer Kotlin-Datei hinzufügen und es in der gesamten Anwendung verwenden, um es als zu übergeben Einzelling. Wie das mit einer Suchtspritze geht, sehen wir uns in späteren Beiträgen an.

Schlüssel definieren

DataStore bietet eine schnelle Möglichkeit, Schlüssel für verschiedene Datentypen zu erstellen, z booleanPreferencesKey, intPreferencesKey und vieles mehr – Sie müssen nur bestehen Schlüsselname als Wert. Obwohl dies einige Einschränkungen für Datentypen mit sich bringt, sollten Sie dies im Hinterkopf behalten bietet keine endgültige Typsicherheit. Indem wir den bevorzugten Schlüssel eines bestimmten Typs bestimmen, hoffen wir das Beste und verlassen uns auf unsere Annahmen der Wert eines bestimmten Typs würde zurückgegeben. Wenn Sie der Meinung sind, dass Ihr Code so strukturiert ist, dass er sicher zu handhaben ist, können Sie gerne mit den Einstellungen fortfahren. Wenn nicht, erwägen Sie, den Bruder von Preferences zu verwenden, Proto-DataStorewie er prophezeit vollständige Sicherheit.

In unserer Anwendung UserPreferencesRepositoryWir geben alle Schlüssel an, die zur Strukturierung der Schlüssel/Wert-Paare unserer persistenten Daten erforderlich sind:

Zum Auslesen gespeicherter Daten, u UserPreferencesRepository wir belichten a Flow<Preferences> von dataStore.data. Dies ermöglicht ein effizientes Vorgehen der letzte erhaltene Zustand ich Sendungen bei jeder Änderung. Mithilfe von Kotlin-Datenklassen können wir alle Sendungen beobachten und den Datenspeicher transformieren Preferences unterliegen unseren UserPreferences Modell, nur verwenden Schlüssel/Wert-Paare wir sind interessiert an:

Flow wird immer entweder einen Wert ausgeben oder verwerfen Sie die Ausnahme beim Versuch, von der Festplatte zu lesen. Wir werden uns in späteren Abschnitten mit der Behandlung von Ausnahmen befassen. Der DataStore stellt außerdem sicher, dass die Arbeit immer erledigt wird Dispatchers.IO Ihr UI-Thread wird also nicht blockiert.

🚨 Erstellen Sie keine Cache-Repositories um den aktuellen Stand Ihrer Präferenzdaten abzubilden. Damit erlischt die DataStore-Garantie für Datenkonsistenz. Wenn Sie eine Aufnahme Ihrer Daten ohne ein Abonnement für weitere Flow-Shows benötigen, verwenden Sie sie stattdessen dataStore.data.first():

Wir werden die Aussetzung verwenden, um Daten zu schreiben DataStore<Preferences>.edit(transform: suspend (MutablePreferences) -> Unit) Funktion. Lassen Sie es uns aufschlüsseln:

Als Beispiel werden wir unsere ändern SHOW_COMPLETED Flagge:

Die Bearbeitung von Daten erfolgt transaktional in einem Atomare Read-Modify-Write-Operation. Das bedeutet, dass es eine bestimmte Abfolge von Datenverarbeitungsvorgängen garantiert, während derer Daten für andere Threads gesperrt sind Konsistenz ich verhindert Rennbedingungen. Nur nach transform ich edit Corutins erfolgreich abgeschlossen, Daten werden dauerhaft auf der Festplatte gespeichert und datastore.data Der Fluss wird die Aktualisierung widerspiegeln.

🚨 Beachten Sie, dass dies die einzige Möglichkeit ist, den Status des DataStore zu ändern. Wartung u MutablePreferences Referenz und manuelle Mutation danach transform vervollständigt ändert die permanenten Daten nicht im DataStore, also sollten Sie nicht versuchen, es zu ändern MutablePreferences außen transform Block.

Wenn der Schreibvorgang aus irgendeinem Grund fehlschlägt, wird die Transaktion beendet und eine Ausnahme ausgelöst.

Wenn Sie es zuvor verwendet haben SharedPreferences in Ihrer Bewerbung und möchten Ihre Daten sicher an Preferences übertragen, können Sie verwenden SharedPreferencesMigration. Dazu braucht es Kontext, SharedPreferences den Namen und den optionalen Schlüsselsatz, den Sie migrieren möchten (oder lassen Sie es einfach so Ursprünglich MIGRATE_ALL_KEYS Wert).

Ansehen SharedPreferencesMigration Implementierung sehen Sie a getMigrationFunction() die dafür verantwortlich ist, alle erforderlichen, gespeicherten Schlüssel/Wert-Paare abzurufen und sie zu den Einstellungen hinzuzufügen gleichen Tasten. Bestehen SharedPreferencesMigration über dem produceMigrations ParameterpreferencesDataStore delegieren an einfach zu migrieren:

produceMigrations wird dafür sorgen getMigrationFunction() wurde gestartet vor einem möglichen Zugriff auf Daten im Datenspeicher. Das bedeutet Ihre Migration ihm muss es gelungen sein bevor der DataStore weitere Werte aussendet und bevor er mit neuen Datenänderungen beginnt. Sobald Sie erfolgreich migriert haben, können Sie die Verwendung sicher einstellen SharedPreferenceswie Schlüssel nur einmal migriert und dann ENTFERNT von SharedPreferences.

Der produceMigrations akzeptiert die Liste DataMigration. Wir werden in späteren Episoden sehen, wie wir dies für andere Arten von Datenmigrationen verwenden können. Wenn Sie nicht migrieren müssen, können Sie dies ignorieren, da es eine gibt Ursprünglich listOf() bereitgestellt schon.

Einer der Hauptvorteile von DataStore gegenüber SharedPreferences ist seine ein geordneter Mechanismus zum Erfassen und Behandeln von Ausnahmen. Während SharedPreferences wirft Parsing-Fehler als Laufzeitausnahmen aus und lässt Raum für unerwartete, nicht abgefangene Abstürze, DataStore wirft aus IOException wenn beim Lesen/Schreiben von Daten ein Fehler auftritt.

Wir können dies sicher lösen, indem wir verwenden catch() Flow-Operator kurz davor map() und Rundfunk emptyPreferences():

Oder mit dem einfachen try-catch Blockschreiben:

Wenn eine andere Art von Ausnahme ausgelöst wird, sollten Sie sie besser erneut auslösen.

Wir deckten ab DataStore-Einstellungen Implementierung – wann und wie man damit Daten liest und schreibt, wie man mit Fehlern umgeht und wie man sie überwindet SharedPreferences. Im nächsten Beitrag werden wir die gleichen Themen mit behandeln Proto-DataStore Umsetzung, also bleiben.

Einführung in Jetpack DataStore von Simona Stojanovic Android-Entwickler Januar 2022

Simona Stojanovic

Datenspeicher ist eine Jetpack-Datenspeicherbibliothek, die eine sichere und konsistente Möglichkeit bietet, kleine Datenmengen wie Einstellungen oder Anwendungsstatus zu speichern. Es basiert auf Kotlin Korutine und Flow die eine asynchrone Datenspeicherung ermöglichen. Es zielt darauf ab, zu ersetzen SharedPreferences, weil es sicher ist und nicht blockiert. Es bietet zwei verschiedene Implementierungen: Proto-DataStoredas typisierte Objekte speichert (unterstützt von Protokollpuffer) ich DataStore-Einstellungen, die Schlüssel/Wert-Paare speichert. Machen wir weiter, wenn wir es einfach benutzen DataStoregilt dies für beide Implementierungen, sofern nicht anders angegeben.

Wir werden uns diesen Blogbeitrag genauer ansehen Datenspeicher – wie es funktioniert, welche Implementierungen es bietet und ihre individuellen Anwendungsfälle. Wir werden uns auch ansehen, welche Vorteile und Verbesserungen es bringt SharedPreferences und warum sich der DataStore dadurch lohnt.

Schauen wir uns einen direkten Vergleich zwischen an SharedPreferences und Datenspeicher:

Vergleich von DataStore-Implementierungen mit SharedPreferences

Asynchrone API

Synchronbetrieb

Es ist jedoch möglich, DataStore und synchronen Betrieb mit ein wenig Hilfe des Corutin-Builders zu kombinieren, wie wir später sehen werden.

Fehlerbehandlung

Sicherheitsstufe

Datenkonsistenz

Migrationsunterstützung

Einstellungen Datenspeicher liest und schreibt datenbasiert Schlüssel/Wert-Paare, ohne vorherige Definition der Regelung. Auch wenn das vielleicht ähnlich klingt SharedPreferences, denken Sie an alle oben genannten Verbesserungen, die der DataStore mit sich bringt. Lassen Sie sich nicht von ihrem Teilen täuschen.”Einstellungen„Bei der Benennung – sie haben nichts gemeinsam und kommen von zwei völlig getrennten APIs.

Proto Datenspeicher Geschäfte getippte Objektemit Unterstützung Protocol Buffers, bietet Typsicherheit und eliminiert die Notwendigkeit von Schlüsseln. Protobuffs sind schneller, kleiner, einfacher und weniger mehrdeutig als XML und andere ähnliche Datenformate. Wenn Sie sie noch nie benutzt haben, haben Sie keine Angst! Dies ist sehr einfach zu lernen. Obwohl der Proto DataStore erfordert, dass Sie einen neuen Serialisierungsmechanismus erlernen, sind wir von seinen Vorteilen besonders überzeugt Typ Sicherheites ist es wert.

Vergleich von DataStore-Implementierungen

Bei der Wahl zwischen den beiden müssen Sie Folgendes berücksichtigen:

  • Wenn Sie mit arbeiten Schlüssel/Wert-Paare zum Lesen und Schreiben von Daten, die Sie möchten schnell migrieren von SharedPreferences mit minimalen Änderungen, während Sie immer noch die Vorteile von DataStore-Verbesserungen nutzen und sich ohne Typsicherheitsprüfungen sicher genug fühlen, können Sie mit gehen DataStore-Einstellungen
  • Wenn Sie Protokollpuffer für den zusätzlichen Vorteil einer verbesserten Lesbarkeit lernen möchten, wenn Ihre Daten Arbeit erfordern komplexere Klassenwie Aufzählungen oder Listen, und die Sie haben möchten vollständige Sicherheit unterstützen, während Sie dies tun, können Sie versuchen Proto-DataStore

Wenn Sie mit arbeiten müssen komplexe Datensätze größer als ein paar 10 KB ist, ist es sehr wahrscheinlich, dass Sie es brauchen werden Teilaktualisierungen oder Referenzintegrität zwischen verschiedenen Datentabellen. In diesem Fall sollte der Einsatz erwogen werden Zimmer.

Wenn Sie jedoch mit arbeiten kleiner und einfacher Datensätzewie z. B. Anwendungseinstellungen oder Status, und daher keine Teilaktualisierungen oder Referenzintegrität erfordern, sollten Sie auswählen Datenspeicher.

So wählen Sie zwischen DataStore und Room

Jetzt in Android #53. Willkommen bei Now in Android, Ihrem dauerhaften … | Lähde: Meghan Mehta | Android-Entwickler Dezember 2021

Er macht Illustrationen Virginia Poltrack

Willkommen bei Now in Android, Ihrem ständigen Leitfaden für Neues und Wichtiges in der Welt der Android-Entwicklung. Wenn das Jahr 2021 näher rückt, lassen Sie uns über einige der großartigen Dinge nachdenken, die wir dieses Jahr für Android getan haben.

Wir veröffentlicht Android 12 und schob es an Android-Open-Source-Projekt (AOSP). Wir haben eine neue Designsprache namens Material Sie. Wir haben die CPU-Zeit reduziert, die von grundlegenden Systemdiensten verwendet wird, hinzugefügt Fähigkeiten der Leistungsklasseund hinzugefügt neue Funktionen zur Verbesserung der Leistung. Benutzer haben mehr Kontrolle über ihre Privatsphäre mit Datenschutz-Dashboard und andere neue Sicherheit und Privatsphäre Eigenschaften. Wir haben die Benutzererfahrung mit a verbessert Einheitliche Rich-Content-Einfügungs-APIs, Kompatible MedientranscodierungEinfacher Unschärfe und Effekte, AVIF-Bildunterstützung, verbesserte HaptikNeu Kameraeffekte / Fähigkeiten, verbessertes ursprüngliches Debugging, Unterstützung für abgerundete Ecken des Bildschirms, Spielen Sie während des Downloadsich Spielmodus-APIs.

Android 12L befindet sich ebenfalls in der Beta-Phase, wodurch Android 12 auf großen Bildschirmen noch besser wird. Enthält Tools für intuitiveres Multitasking, Kompatibilitätsverbesserungen und mehr! Probieren Sie es noch heute aus.

Jetpack komponierenist das moderne, originelle UI-Tool von Android geworden stabil und bereit für die Inbetriebnahme. Dass interoperiert mit Ihrer bestehenden Anwendung, integriert mit vorhandene Jetpack-BibliothekenAnschlüsse Material Design mit direkte Thematisierungunterstützt Listen mit Lazy-Komponenten mit einer minimalen Vorlage und hat eine leistungsstarke, erweiterbare Animationssystem. Weitere Informationen zum Arbeiten mit Compose finden Sie unter Stellen Sie einen Lernpfad zusammen und sehen, wohin wir in zukünftigen Compose-Editionen gehen Erstellen Sie eine Straßenkarte.

In diesem Jahr hat das Android Training Team die letzten vier neuen Einheiten veröffentlicht Grundlagen von Android in Kotlin.

  • Einheitsabdeckungen 3 Navigation wo Sie lernen, durch verschiedene Bildschirme innerhalb Ihrer App zu navigieren, sie einzugeben und zurückzukehren.
  • Einheitsabdeckungen 4 Internetverbindung. Sie schreiben asynchronen Code, lernen HTTP und REST kennen, um Daten aus dem Internet abzurufen, und verwenden die Coil-Bibliothek, um Bilder in Ihrer Anwendung anzuzeigen.
  • Einheit 5 umfasst Datenkonsistenz Hier erfahren Sie, wie Sie Daten auf dem Gerät speichern, was Teil der Gewährleistung einer reibungslosen und konsistenten Benutzererfahrung ist, auch bei Netzwerkausfällen.
  • Einheitsabdeckungen 6 Arbeitsmanager wo Sie die Android Jetpack WorkManager-API verwenden, um Hintergrundarbeiten zu planen, die auch dann weiter funktionieren, wenn die App geschlossen oder das Gerät neu gestartet wird.

Wir hatten ein fantastisches Jahr für MAD Skills und veröffentlichten mehrere Serien von Videos und Blogs, die viele wichtige Themen abdecken:

  • Kotlin und Jetpack – Erlernen Sie die Grundlagen von Jetpack KTX-Bibliotheken, wie Sie Rückrufe mit Rollen und Flow vereinfachen und wie Sie Room / WorkManager-APIs verwenden und testen.
  • Bewegungslayout – Erfahren Sie, wie Sie MotionLayout und sein Designtool verwenden, um reichhaltige, animierte Erlebnisse zu erstellen.
  • Arbeitsmanager – Erfahren Sie, wie Sie kritische Hintergrundarbeiten mit WorkManager planen: von der grundlegenden Verwendung über Threads bis hin zu benutzerdefinierten Konfigurationen und mehr.
  • Navigation – Lernen Sie die Grundlagen der Navigationskomponente, spezifische Funktionen von Tools und APIs zum Erstellen von und Navigieren zu Zielen.
  • Leistung – Erfahren Sie mehr über die Verwendung von System-Tracking und Sampling-Profiling zum Debuggen von Anwendungsleistungsfehlern.
  • Griff – Erfahren Sie, wie Sie Hilt hinzufügen und verwenden, um Ihrer Android-App Sucht hinzuzufügen, Best Practices zum Testen mit Hilt und erweiterte Inhalte.
  • Paging – Erlernen Sie die Grundlagen von Seiten, von grundlegenden Typen bis hin zur Verknüpfung mit Ihren UI-Elementen.
  • Gradl – Erfahren Sie, wie Sie Ihre Version konfigurieren, den Build-Prozess an Ihre Bedürfnisse anpassen und wie Sie Ihre eigenen Add-Ons schreiben, um Ihre Version weiter zu erweitern.

Weitere Inhalte finden Sie hier Playlist MAD-Fähigkeiten auf Youtube, Artikel auf Mediumoder diese praktische Landingpage es deutet auf all das hin.

Dieses Jahr hatten wir Google I/O ich Android Dev Summitvirtuell und kostenlos für alle!

Wir haben Updates zu I/O in veröffentlicht Jetpack, Komponieren, Android Studio-Tools, Große Bildschirme, Betriebssystem tragen, Testen, und mehr! Alles nachholen Android-Videos sind I/O!!

Auf dem Android Dev Summit haben wir Updates zu gepostet Privatsphäre und Sicherheit, große Bildschirme, Android 12, Google Play und Spiele, Bauen Sie über den Bildschirm, Jetpack komponieren, Moderne Android-Entwicklung und mehr. Schau dir alles an Videos von ADS!!

Wir haben neue veröffentlicht Leitfäden zur Anwendungsarchitektur, Carry Jetpack OS-Bibliotheken war stabil, Hilt wurde stabilwir lassen los Entwicklungskit für Android-Spielehaben wir eine erstellt Videoserie zur Barrierefreiheiter ließ los Bibliotheks-App für Android für Autos und vieles mehr.

Aktuelle Android-Inhalte finden Sie in unserer Bloggen, Mittel, Youtube Kanalich Podcast.

Vielen Dank, dass Sie sich engagieren, großartige Apps erstellen, Feedback geben und Teil unserer weltweiten Entwickler-Community sind. Wir werden 2022 mit weiteren Android-Updates zurück sein! 😍😍😍

Vereinfachen Sie Drag-and-Drop. Heute präsentieren wir DropHelper in… | von Paul Lammertsma Android-Entwickler Dezember 2021

Paul Lammertsma

Auf der grundlegendsten Ebene, ziehen und ablegen ist eine Bewegung, bei der der Benutzer ein Bild, eine Textzeichenfolge oder ein anderes Datenelement berühren und halten, es dann in eine andere Anwendung (oder an eine andere Stelle in derselben Anwendung) ziehen und loslassen kann, wo die Daten an einer neuen Stelle eingebettet werden. Diese Bewegung ist normalerweise ein langes Drücken auf den Touch- oder Klickbildschirmen und Ziehen und Ablegen bei Verwendung der Maus.

Einfaches Drag & Drop-Muster.

Obwohl Android Drag & Drop seit langem unterstützt (DragEvent wurde in Android 3.0, API-Level 11 eingeführt), erwies sich die Integration der vollständigen Unterstützung für die Handhabung von Gesten, Ereignissen, Berechtigungen und Rückrufen als komplex.

Wischen und Ablegen wird für die Formfaktoren großer Bildschirme immer relevanter: Tablets und Laptops, aber insbesondere zusammenklappbare, bei denen ein geteilter Bildschirm verwendet wird 7 mal öfter als bei herkömmlichen Telefonen. Die Möglichkeit, Daten von einer Anwendung in eine andere zu ziehen, ist eine natürliche Erfahrung für Benutzer, da sie mit ihren Anwendungen mehrere Aufgaben effizienter ausführen können geteilter Bildschirm oder Fenstermodus.

Beim Ziehen von Text aus EditTexts ursprünglich von der Plattform unterstützt wird, empfehlen wir dringend, dass Sie Benutzern erlauben, Bilder, Dateien oder Text aus anderen Komponenten Ihrer Anwendung zu ziehen. Ebenso wichtig ist, dass wir Sie ermutigen, Benutzern auch das Einfügen von Daten in Ihre Anwendungen zu erlauben.

Ziehen Sie von einer App in eine andere.

DropHelperkombiniert mit DragStartHelpererleichtert die Pflege von Bewegungsunterstützung, Rückrufen, Stil und perfekter Pixelausrichtung erheblich.

DragStartHelper

DragStartHelper ist eine Dienstprogrammklasse im Jetpack-Kern, die Bewegungen erkennt, die häufig zum Starten eines Ziehens verwendet werden, z. B. langes Drücken oder Klicken und Ziehen.

DropHelper

Neu DropHelper ist eine Serviceklasse, die sich um Zuhörer kümmert und Ziele ablehnt. Unbedingt verwenden addInnerEditTexts() während der Konstruktion DropHelper.Options um sicherzustellen, dass alle verschachtelt EditTexts innerhalb Ihres Zielsturzes gewinnen Sie stattdessen nicht den Fokus.

Mehr erfahren

Lesen Sie mehr in Ziehen Sie den Leitfaden per Drag-and-Drop zu Android-Entwicklerneintauchen großer Beispielbildschirm um zu sehen DropHelper in der Praxis, dann versuchen Sie es jetzt in der Alpha-Version Geben Sie uns eine Rückmeldung.

Danke für Florina, Ben ich Nick!!

Android Developer Relations beschäftigt Lähde: Maru Ahues Bouza | Android-Entwickler Dezember 2021

Eine illustrierte dunkelhäutige Frau, die auf dem Boden liegt und auf einen Laptop mit dem Android-Logo blickt
Android Developer Story: Spotify auf allen Bildschirmen
Erstellen Sie Codebeispiele, die Menschen inspirieren und ihnen beim Lernen helfen
Lernen Sie Millionen von Programmierern durch Lernmaterialien
Lernen Sie Millionen von Programmierern durch Lernmaterialien
Erstellen Sie eine Anwendung, die Ihrer Community mit Android GDE hilft: Gaston Saillen
#AndroidDevSummit ’21 wird in 60 Sekunden fortgesetzt!
Training der neuen Generation von Android-Entwicklern

Jetzt in Android #52. Paging, Gradle, AndroidX, Media3… | lähde: Manuel Vivo | Android-Entwickler

Manuel Vivo

Willkommen bei Now in Android, Ihrem ständigen Leitfaden für Neues und Wichtiges in der Welt der Android-Entwicklung.

Vielen Dank, dass Sie die Reihe „Now in Android“ und alles, was der YouTube-Kanal für Android-Entwickler zu bieten hat, verfolgt haben. Während des Android Developer Summit erreichte unser YouTube-Kanal 1 Million Abonnenten! Und hier ist ein kleines Video, um euch allen zu danken.

Die Serie geht weiter Paging ist schon vorbei! In der dritten Folge TJ zeigt die verschiedenen Operationen, die mit der Seite durchgeführt werden können. Transformationen wie das Einfügen von Trennzeichen, beim Erstellen eines neuen Pagers und Anpassungsoptionen für den Verbrauch PagingData.

Im folgenden Video teilt Erik Zuo von der Android-Community einen Paging-Tipp mit Ihnen.

Und um die Reihe zu beenden, TJ ich Dustin beantwortete Ihre Fragen in allgemeinen Fragen und Live-Antworten.

Später Paging, die neue MAD Skills-Serie hat begonnen, diesmal über Gradle! Im folgenden Video Murat repräsentiert die Serie und alles, was Sie darin lernen werden.

In der ersten Folge erklärt Murat, wie das Android-Build-System funktioniert und wie Sie Ihre Version konfigurieren.

In der zweiten Folge erfahren Sie, wie Sie Ihre Version erweitern, indem Sie Ihr eigenes Add-on schreiben.

Und schließlich, in der dritten Folge, gehen Sie mit Ihrem Add-On noch einen Schritt weiter und erfahren, wie Sie mithilfe des Neuen Zugang zu verschiedenen Gebäudeartefakten erhalten Artefakt API.

Mehr MAD-Inhalte

Aber warte! Als ob das nicht genug wäre, gibt es noch mehr VERRÜCKTE Inhalte!

Für aktuelle Inhalte, achten Sie darauf, zu überprüfen Playlist MAD-Fähigkeiten auf Youtube, Artikel auf Mediumoder diese praktische Landingpage es deutet auf all das hin.

Seit der letzten Nicht-ADS Now-Episode in Android wurden viele Bibliotheken auf Stable hochgestuft! Beispielsweise, AppCompat, Aktivitätich Fragment sind jetzt in 1.4.0 mit stabiler Unterstützung für mehrere Backstacks. Emoji2 1.0, das Unterstützung für moderne Emojis bringt. Lebenszyklus 2.4, der einführt repeatOnLifecycle ich flowWithLifecycle Lebenszyklusbewusste APIs. Paging 3.1 bringt einige Verhaltensänderungen mit sich LoadState. ich Fliesen tragen mit dem Sie benutzerdefinierte Kacheln für Wear OS-Geräte erstellen können, die auf 1.0 gekommen sind.

All dies ist bereits stabil! Geh und benutze sie! Sie können alle Hinweise zum AndroidX-Release sehen Hier.

Jetpack-Medien3

Das erste Alpha von Jetpack-Medien3 die Bibliothek ist vorhanden. Media3 ist eine Sammlung von Bibliotheken zur Unterstützung der Medienwiedergabe, einschließlich ExoPlayer. Der folgende Artikel erklärt, warum das Team Media3 erstellt hat, was es enthält und wie es die Architektur Ihrer Anwendung vereinfachen kann.

Meghan schrieb über das Neue Emoji2 eine Bibliothek, die gerade stabil geworden ist. Lesen Sie mehr über das Problem mit Emoji-Symbolen und wie emoji2 Ihnen helfen kann.

Wir haben mehr Artikel darüber KameraX!! Dieses Mal geht es um eine neue Funktion in CameraX zur Konvertierung von YUV, einem von CameraX produzierten Format, in RGB, das für Bildanalysefunktionen verwendet wird, die in verfügbar sind TensorFlow Lite, zum Beispiel. Lesen Sie den Blogbeitrag für weitere Informationen zu diesen Formaten und zur Verwendung der neuen Konvertierungsfunktion.

Die Verbesserung der Startzeit von Anwendungen ist keine triviale Aufgabe und erfordert ein tiefes Verständnis der Dinge, die sich darauf auswirken. In diesem Jahr haben das Android-Team und das Facebook-App-Team gemeinsam an Metriken und Freigabeansätzen gearbeitet, um den App-Start zu verbessern. Lesen Sie mehr über die Ergebnisse in diesem Blogbeitrag.

Die Serie zur Barrierefreiheit wird mit weiteren Informationen zum Erstellen benutzerdefinierter Aktionen zur Barrierefreiheit fortgesetzt, um Ihre Anwendungen zugänglicher zu machen. Sie können Barrierefreiheitsdiensten benutzerdefinierte Aktionen bereitstellen und aktionsbezogene Logik implementieren. Weitere Informationen finden Sie in der nächsten Folge!

Mehr dazu erfahren Sie in dieser zweiten Folge Zustandsbeschreibung API, wann zu verwenden stateDescription ich contentDescriptionund wie man dem Endbenutzer Fehlerzustände präsentiert.

Wenn Sie sich für Wear OS und Jetpack Compose interessieren, hat das Team ein neues veröffentlicht Build for Wear OS-Codelab. Dort erfahren Sie, wie Wear OS mit Compose zusammenarbeiten kann, welche Wear OS-spezifischen Composites verfügbar sind und vieles mehr!

Es gab eine Folge Android-Entwickler hinter den Kulissen seit dem letzten Now in Android veröffentlicht. Schauen Sie sich den Link unten oder in Ihrem bevorzugten Podcast-Client an:

U Folge 178: Zuhause 3, Auswärts 0, Chet, Romain ich Tor Setzen Sie sich zusammen, um den Android Developer Summit und insbesondere alle neuen Funktionen von Android Studio zu diskutieren, zusammen mit mehreren anderen Themen wie Chets neuer Bibliothek mit Jank-Statistiken, Android 12L-Edition und mehr.

Das war es für dieses Mal, mit Paging ich Gradl MAD Skills-Serie, AndroidX Editionen, neues Jetpack Medien3 Bibliothek, Artikel über Emoji2, Starten Sie die Anwendungich KameraX, Barrierefreiheit Videos, neu Tragen Sie das OS-Codelabia neue ADB-Folge!!

Kommen Sie bald wieder hierher für das nächste Update aus dem Android-Entwickleruniversum.