Datenspeicher
Letzte Aktualisierung | Stabile Version | Releasekandidat | Beta-Ausgabe | Alpha-Release |
---|---|---|---|---|
1. Mai 2024 | 1.1.1 | - | – | - |
Abhängigkeiten deklarieren
Um eine Abhängigkeit von DataStore hinzuzufügen, müssen Sie das Google Maven-Repository zu Ihrem Projekt arbeiten. Maven-Repository von Google lesen .
Es gibt zwei Implementierungen von DataStore: Einstellungen und Protokoll: Wählen Sie eine der beiden Optionen aus. Sie können auch Abhängigkeiten ohne Android Implementierung.
Fügen Sie die Abhängigkeiten für die benötigte Implementierung in die Datei build.gradle
ein.
für Ihre App oder Ihr Modul:
Einstellungen-Datenspeicher
Cool
// Preferences DataStore (SharedPreferences like APIs) dependencies { implementation "androidx.datastore:datastore-preferences:1.1.1" // optional - RxJava2 support implementation "androidx.datastore:datastore-preferences-rxjava2:1.1.1" // optional - RxJava3 support implementation "androidx.datastore:datastore-preferences-rxjava3:1.1.1" } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation "androidx.datastore:datastore-preferences-core:1.1.1" }
Kotlin
// Preferences DataStore (SharedPreferences like APIs) dependencies { implementation("androidx.datastore:datastore-preferences:1.1.1") // optional - RxJava2 support implementation("androidx.datastore:datastore-preferences-rxjava2:1.1.1") // optional - RxJava3 support implementation("androidx.datastore:datastore-preferences-rxjava3:1.1.1") } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation("androidx.datastore:datastore-preferences-core:1.1.1") }
Proto DataStore
Cool
// Typed DataStore (Typed API surface, such as Proto) dependencies { implementation "androidx.datastore:datastore:1.1.1" // optional - RxJava2 support implementation "androidx.datastore:datastore-rxjava2:1.1.1" // optional - RxJava3 support implementation "androidx.datastore:datastore-rxjava3:1.1.1" } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation "androidx.datastore:datastore-core:1.1.1" }
Kotlin
// Typed DataStore (Typed API surface, such as Proto) dependencies { implementation("androidx.datastore:datastore:1.1.1") // optional - RxJava2 support implementation("androidx.datastore:datastore-rxjava2:1.1.1") // optional - RxJava3 support implementation("androidx.datastore:datastore-rxjava3:1.1.1") } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation("androidx.datastore:datastore-core:1.1.1") }
Feedback
Dein Feedback hilft uns, Jetpack zu verbessern. Teilen Sie uns mit, wenn Sie neue Ausgaben entdecken oder zur Verbesserung dieser Bibliothek. In der bestehende Probleme in dieser Bibliothek, bevor Sie eine neue erstellen. So können Sie für ein vorhandenes Problem abstimmen: indem Sie auf die Sternschaltfläche klicken.
Weitere Informationen finden Sie in der Dokumentation zur Problemverfolgung. .
Version 1.1
Version 1.1.1
1. Mai 2024
androidx.datastore:datastore-*:1.1.1
wurde veröffentlicht. Version 1.1.1 enthält diese Commits.
Fehlerkorrekturen
- Geminderter Linux-Fehlalarm bei „Ressourcen-Deadlock würde auftreten“ In einem Grenzfall versuchen mehrere
DataStore
-Instanzen, aus verschiedenen Prozessen zu schreiben, indem sie die Dateisperre sichern.
Version 1.1.0
17. April 2024
androidx.datastore:datastore-*:1.1.0
wurde veröffentlicht. Version 1.1.0 enthält diese Commits.
Wichtige Änderungen seit Version 1.0.0
Weitere Informationen finden Sie in den Versionshinweisen der Alpha- und Betaversion 1.1.0. Einige der wichtigsten Aktualisierungen in Version 1.1.0 sind:
- DataStore unterstützt jetzt mehrere Prozesse, die auf dieselbe Datei zugreifen, mit Unterstützung für die prozessübergreifende Beobachtbarkeit.
- Mit der neuen Storage-Schnittstelle können Sie anpassen, wie Ihre Datenmodelle gespeichert oder serialisiert werden.
- Sie können DataStore jetzt in Kotlin Multiplatform-Projekten verwenden.
Version 1.1.0-rc01
3. April 2024
androidx.datastore:datastore-*:1.1.0-rc01
wurde veröffentlicht. Version 1.1.0-rc01 enthält diese Commits.
Fehlerkorrekturen
- Ein Fehler wurde behoben, durch den
updateData
-Aufrufe die Schreibvorgänge auf dem Laufwerk nicht optimieren konnten, wenn die neuen Daten mit den alten Daten identisch waren (d64cfb5). - Es wurde eine Race-Bedingung behoben, bei der
MultiProcess
DataStore
während der Initialisierung möglicherweise Entwertungen verpasst. ((b/326141553),(094c2dd))
Version 1.1.0-beta02
6. März 2024
androidx.datastore:datastore-*:1.1.0-beta02
wurde veröffentlicht. Version 1.1.0-beta02 enthält diese Commits.
Fehlerkorrekturen
- Bei der Leistungsverbesserung für „
DataStore
“ werden nur dann Benachrichtigungen über Updates erhoben, wenn sie erkannt werden. (b/267792241) <ph type="x-smartling-placeholder">- </ph>
- Beachten Sie, dass diese Änderung in Ihren Tests möglicherweise
UncompletedCoroutinesError
auslösen kann, wenn Sie die Coroutines-Testbibliothek verwenden. Um dieses Problem zu vermeiden, musst du beim Initialisieren vonDataStore
in deinen Tests dieTestScope.backgroundScope
bestehen.
- Beachten Sie, dass diese Änderung in Ihren Tests möglicherweise
- Das Problem, dass verschachtelte
updateData
-Aufrufe für dieselbe Instanz zu einem Deadlock führten, wurde behoben. (b/241760537) DataStore
gibtIOExceptions
nicht mehr aus, wennSharedPreferences
während der Migration nicht gelöscht werden kann. (b/195553816)- Das Problem, bei dem die Umbenennung von Dateien während
updateData
in Nicht-Android-JVM-Umgebungen fehlgeschlagen ist, wurde behoben. (b/203087070) - Das Problem, dass
CorruptionException
nach der Initialisierung vonDataStore
nicht verarbeitet wurde, wurde behoben. (b/289582516)
Version 1.1.0-beta01
10. Januar 2024
androidx.datastore:datastore-*:1.1.0-beta01
wurde ohne Änderungen seit dem 1.1.0-alpha07
freigegeben. Version 1.1.0-beta01 enthält diese Commits.
Version 1.1.0-alpha07
29. November 2023
androidx.datastore:datastore-*:1.1.0-alpha07
wurde veröffentlicht. Version 1.1.0-alpha07 enthält diese Commits.
API-Änderungen
MultiProcessDataStoreFactory
-Methoden befinden sich nicht mehr in der Testphase.Die Anmerkung@ExperimentalMultiProcessDataStore
wurde vollständig entfernt. (Ieee54, I8e607)
Fehlerkorrekturen
- Roll-out der Entfernung der
@ExperimentalMultiProcessDataStore
-Annotationen für 1.1.0-alpha07 durchführen. (I8e607)
Version 1.1.0-alpha06
1. November 2023
androidx.datastore:datastore-*:1.1.0-alpha06
wurde veröffentlicht. Version 1.1.0-alpha06 enthält diese Commits.
API-Änderungen
- Die Factory-Methode
createSingleProcessCoordinator
empfängt jetzt einen Dateipfad (String
,java.io.File
undokio.Path
), um mitcreateMultiProcessCoordinator
konsistent zu sein. (I211c8, b/305755935)
Version 1.1.0-alpha05
6. September 2023
androidx.datastore:datastore-*:1.1.0-alpha05
wurde veröffentlicht. Version 1.1.0-alpha05 enthält diese Commits.
API-Änderungen
- Datastore
FileStorage
ist jetzt öffentlich verfügbar, sodass Clients benutzerdefinierte Parameter angeben können. (Icb985) - Der
OkioStorage
-Konstruktor akzeptiert jetzt einenInterProcessCoordinator
, sodass er unter Android mitMultiProcessCoordinator
verwendet werden kann. (Iecea3)
Fehlerkorrekturen
- Fehler behoben, bei dem
MultiProcessCoordinator
nicht mehrere Dateien im selben Verzeichnis überwachen konnte - Es konnten keine doppelten Dateien gefunden werden, wenn Dateipfade nicht normalisiert wurden.
- Korrigieren Sie die falschen von
RxDataStore#isDisposed
zurückgegebenen Werte. - Fehlende Proguard-Konfiguration für Artefakt
datstore-preferences-core
wurde korrigiert.
Version 1.1.0-alpha04
5. April 2023
androidx.datastore:datastore-*:1.1.0-alpha04
wurde veröffentlicht. Version 1.1.0-alpha04 enthält diese Commits.
Fehlerkorrekturen
- Verbessern Sie die interne Implementierung, um eine Race-Bedingung zu vermeiden, bei der der Datenfluss von
DataStore
nach einer Aktualisierung einen älteren Wert ausgibt.
Version 1.1.0-alpha03
24. März 2023
androidx.datastore:datastore-*:1.1.0-alpha03
wurde veröffentlicht.
Fehlerkorrekturen
- Abhängigkeitseinschränkungen aus Maven-Artefakten wurden entfernt, um ein Build-Problem in nativen Kotlin-Zielen zu umgehen (b/274786186, KT-57531).
Version 1.1.0-alpha02
22. März 2023
androidx.datastore:datastore-*:1.1.0-alpha02
wurde veröffentlicht. Version 1.1.0-alpha02 enthält diese Commits.
Hinweis
Beachten Sie, dass diese Version eine wichtige interne Refaktorierung enthält, bei der die Implementierungen für Ein- und Mehrprozess-DataStore-Implementierungen zusammengeführt werden. Achten Sie daher auf mögliche unerwünschte Verhaltensänderungen, z.B. den Zeitpunkt von Updatebenachrichtigungen. Mit der Issue Tracker-Komponente können Sie solche Änderungen melden.
Neue Funktionen
- Sie können jetzt
DataStore
in KMM-Projekten verwenden. Nicht auf Android basierende Ziele von DataStore befinden sich noch in der Testphase. Wir haben jedoch beschlossen, Versionen zusammenzuführen, um Entwicklern das Testen zu erleichtern. - Multiprozessfunktionen wurden von
androidx.datastore.multiprocess
nachandroidx.datastore.core
verschoben. - Fügen Sie eine neue Factory-Methode in
androidx.datastore.core.MultiProcessDataStoreFactory
hinzu, um DataStore-Instanzen mitStorage
-Objekten für Dateivorgänge zu erstellen. - Fügen Sie eine neue Schnittstelle
InterProcessCoordinator
hinzu, die die Kommunikation mehrerer DataStore-Instanzen zwischen Prozessen erleichtert. Die Implementierung mehrerer Prozesse vonInterProcessCoordinator
ist nur unter Android verfügbar.
API-Änderungen
InterProcessCoordinator
zuStorageConnection
in der Datastore-Core-Schnittstelle (I555bb) hinzufügen- Ändern Sie die APIs in
MultiProcessDataStoreFactory
im Datenspeicherkern so, dass Storage verwendet wird. (Iac02f) - Öffentliche APIs in datastore-multiprocess in datastore-core (I76d7c) verschieben
PreferencesSerializer
aus datastore-preferences-core (I4b788) verfügbar gemacht- Annotation
@JvmDefaultWithCompatibility
hinzufügen (I8f206)
Version 1.1.0-alpha01
9. November 2022
androidx.datastore:datastore-*:1.1.0-alpha01
wurde veröffentlicht. Version 1.1.0-alpha01 enthält diese Commits.
Neue Funktionen
- Unterstützung von Multi-Prozess-Anwendungsfällen, bei denen die Datenkonsistenz in
DataStore
Instanzen prozessübergreifend garantiert ist. Fügen SieMultiProcessDataStoreFactory#create
hinzu, um solcheDataStore
-Instanzen zu erstellen. - Neue Speicherschnittstelle, über die der zugrunde liegende Speichermechanismus für
Datastore
ausgetauscht werden kann. Implementierungen für java.io und okio werden bereitgestellt.DataStore
Factorys haben neue Methoden, die dieses Storage-Objekt akzeptieren.
API-Änderungen
- Ändern Sie die APIs in
MultiProcessDataStoreFactory
im Datenspeicherkern so, dass Storage verwendet wird. (Iac02f) - Öffentliche APIs in datastore-multiprocess in datastore-core (I76d7c) verschieben
PreferencesSerializer
aus datastore-preferences-core (I4b788) verfügbar gemacht
Version 1.0.0
Version 1.0.0
4. August 2021
androidx.datastore:datastore-*:1.0.0
wurde veröffentlicht. Version 1.0.0 enthält diese Commits.
Hauptfunktionen von Version 1.0.0
Jetpack DataStore ist eine Datenspeicherlösung, mit der Sie Schlüssel/Wert-Paare oder typisierte Objekte mit Protokollzwischenspeichern speichern können. DataStore verwendet Kotlin-Koroutinen und Flow, um Daten asynchron, konsistent und transaktional zu speichern.
Version 1.0.0-rc02
21. Juli 2021
androidx.datastore:datastore-*:1.0.0-rc02
wurde veröffentlicht. Version 1.0.0-rc02 enthält diese Commits.
Fehlerkorrekturen
- Es wurde verdeutlicht, dass
SharedPreferencesMigration
nicht ausgeführt wird, wenn keine Schlüssel vorhanden sind. (Icfa32, b/192824325) - Es wurde ein Fehler behoben, bei dem
SharedPreferencesMigration
mitMIGRATE_ALL_KEYS
eine Ausnahme auslöste, wenn der angeforderte Schlüssel noch nicht vorhanden war. (Ie318a, b/192824325)
Version 1.0.0-rc01
30. Juni 2021
androidx.datastore:datastore-*:1.0.0-rc01
wurde veröffentlicht. Version 1.0.0-rc01 enthält diese Commits.
Fehlerkorrekturen
- Es wurde ein Fehler behoben, bei dem eine Java-Datei versehentlich der endgültigen JAR-Datei hinzugefügt wurde (I65d96, b/188985637).
Version 1.0.0-beta02
16. Juni 2021
androidx.datastore:datastore-*:1.0.0-beta02
wurde veröffentlicht. Version 1.0.0-beta02 enthält diese Commits.
Fehlerkorrekturen
ClassVerificationFailure
korrigieren (b/187450483)
Version 1.0.0-beta01
21. April 2021
androidx.datastore:datastore-*:1.0.0-beta01
wurde veröffentlicht. Version 1.0.0-beta01 enthält diese Commits.
API-Änderungen
- JVM-Überlastungen für reine Kotlin-Methoden entfernen (I2adc7)
Fehlerkorrekturen
- Es wurde ein Fehler behoben, bei dem Datenspeicherdelegierte zu Datenlecks führen konnten (Ie96fc, b/184415662).
Version 1.0.0-alpha08
10. März 2021
androidx.datastore:datastore-*:1.0.0-alpha08
wurde veröffentlicht. Version 1.0.0-alpha08 enthält diese Commits.
API-Änderungen
- Sie können jetzt dem Property-Delegaten für
dataStore
undpreferencesDataStore
eine Migration hinzufügen, die vom Kontext abhängt. (I4ef69, b/173726702) - Fügt Hilfsfunktionen zum Abrufen des Dateinamens hinzu, wenn Sie datastore delegate oder context.createDataStore nicht mehr verwenden (I60f9a)
- Die Serializer writeTo und readFrom werden jetzt angehalten. Wenn Sie einen Serializer implementiert haben, müssen Sie Ihre Funktionen so aktualisieren, dass sie Aussetzungsfunktionen sind. (I1e58e)
- Property-Bevollmächtigte für RxDataStore-Nutzer hinzugefügt. (Ied768, b/173726702)
Fehlerkorrekturen
- Einschränkungen für die öffentliche Nutzung experimenteller APIs erzwingen (I6aa29, b/174531520)
Version 1.0.0-alpha07
24. Februar 2021
androidx.datastore:datastore-*:1.0.0-alpha07
wurde veröffentlicht. Version 1.0.0-alpha07 enthält diese Commits.
API-Änderungen
Die Erweiterungsfunktion
Context.createDataStore
wurde entfernt und durch einen globalDataStore-Property-Delegaten ersetzt. Rufen Sie globalDataStore einmal auf der obersten Ebene Ihrer Kotlin-Datei auf. Beispiel:val Context.myDataStore by dataStore(...)
Legen Sie dies auf der obersten Ebene Ihrer Kotlin-Datei ab, sodass es nur eine Instanz gibt. (I57215, b/173726702)
Die RxDataStore-Funktionen befinden sich jetzt in einer RxDataStore-Klasse anstelle von Erweiterungsfunktionen in DataStore. (Idccdb, b/177691248)
Wenn Sie EncryptedSharedPreferences (oder SharedPreferences per Direktstart) zu DataStore migrieren möchten, können Sie dies jetzt mit dem neuen SharedPreferencesMigration-Konstruktor tun, mit dem Sie SharedPreferences einfügen können. (I8e04e, b/177278510)
Fehlerkorrekturen
- DataStore gibt jetzt eine Ausnahme aus, wenn mehrere aktive Datenspeicher für dieselbe Datei vorhanden sind. Wenn Sie Ihren Datenspeicher nicht als Singleton verwaltet haben oder nicht sichergestellt haben, dass nicht zwei Instanzen von Datenspeicher für eine Datei gleichzeitig aktiv sind, werden jetzt beim Lesen oder Schreiben in DataStore Ausnahmen angezeigt. Diese Probleme können behoben werden, indem Sie Ihren Datenspeicher als Singleton verwalten. (Ib43f4, b/177691248)
- Das Abbruchverhalten beim Beenden des Aufrufbereichs wurde behoben. (I2c7b3)
Version 1.0.0-alpha06
13. Januar 2021
androidx.datastore:datastore-*:1.0.0-alpha06
wurde veröffentlicht. Version 1.0.0-alpha06 enthält diese Commits.
Neue Funktionen
- Es wurden RxJava-Wrapper für DataStore hinzugefügt. Die
datastore-rxjava2/3
-Artefakte enthalten die Wrapper für die wichtigsten DataStore APIs (RxDataStore
,RxDataStoreBuilder
undRxDataMigration
). Diedatastore-preferences-rxjava2/3
-Artefakte enthalten einen Builder zum Erstellen eines Einstellungs-Datenspeichers.
API-Änderungen
- CorruptionHandler-Oberfläche ausblenden. Es gab keinen Grund, sie öffentlich zu machen, da die DataStore Factory nur einen ReplaceFileCorruptionHandler akzeptiert. (I0b3b3, b/176032264)
- Die Methode
preferencesKey<T>(name: String): Key<T>
wurde entfernt und durch Methoden ersetzt, die für jeden unterstützten Typ spezifisch sind. Zum Beispiel istpreferencesKey<Int>("int")
jetztintPreferencesKey("int")
(Ibcfac, b/170311106).
Fehlerkorrekturen
- Korrigierte Dokumentation in DataStoreFactory, bei der nicht berücksichtigt wurde, dass die Datenspeicherdatei im Unterverzeichnis „datastore/“ erstellt wird. (Ica222)
Version 1.0.0-alpha05
2. Dezember 2020
androidx.datastore:datastore-*:1.0.0-alpha05
wurde veröffentlicht. Version 1.0.0-alpha05 enthält diese Commits.
Fehlerkorrekturen
- Eine bessere Dokumentation und Ausnahmen für gleichzeitige Schreibvorgänge aus Datenspeichern wurden hinzugefügt. (Ia98a2, b/173522155, b/173726702)
- Jetzt wird das Schließen des an
Serializer.writeTo()
übergebenen OutputStreams zugelassen (ist jedoch nicht erforderlich). (I5c9bf, b/173037611)
Version 1.0.0-alpha04
17. November 2020
androidx.datastore:datastore-*:1.0.0-alpha04
wurde veröffentlicht. Version 1.0.0-alpha04 enthält diese Commits.
Fehlerkorrekturen
- Ein Problem mit der Paketerstellung, das den folgenden Absturz im Präferenzdatenspeicher
1.0.0-alpha03
verursachte, wurde behoben:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/datastore/preferences
<ph type="x-smartling-placeholder">- </ph>
- Der Absturz wurde ursprünglich hier gemeldet: b/173036843
- (I4712d, b/173036843)
Version 1.0.0-alpha03
11. November 2020
androidx.datastore:datastore-*:1.0.0-alpha03
wurde veröffentlicht. Version 1.0.0-alpha03 enthält diese Commits.
Neue Funktionen
- In den Einstellungen werden jetzt doppelte Werte unterstützt. Dies ist nützlich, wenn Sie mehr Genauigkeit als Gleitkommazahlen benötigen (I5be8f, b/169471808).
API-Änderungen
- Es wurde eine reine Kotlin-Abhängigkeit für den Datenspeicher erstellt, um eine schnellere Kompilierung zu ermöglichen.
androidx.datastore:datastore-core
enthält die Kern-APIs nur für Kotlin undandroidx.datastore:datastore
die von Android abhängigen APIs, einschließlich desSharedPreferencesMigration
- undContext.createDataStore
-Konstruktors. (I42d75, b/168512698). - Aufteilen von Zielen für Präferenzdatenspeicher zur schnelleren Codierung von Codierungen (Ia3c19)
Serialisierer erfordern jetzt eine neue Eigenschaft für den Standardwert, der verwendet wird, wenn sich keine Daten auf dem Laufwerk befinden. Dies vereinfacht die Implementierung benutzerdefinierter Serialisierer, sodass Nutzer keine leeren Eingabestreams in Sonderfällen benötigen (leere Eingabestreams werden nicht mit JSON geparst).
- Außerdem gibt es jetzt eine Prüfung, um zu bestätigen, dass der an writeTo() bereitgestellte Ausgabestream nicht geschlossen ist. Wenn er geschlossen ist, werden Ausnahmen ausgelöst (I16e29).
Der Konstruktor für SharedPreferencesView wurde intern festgelegt. Sie war ursprünglich öffentlich, um Tests zu ermöglichen. Die Tests sollten stattdessen eine SharedPreferencesMigration erstellen und damit testen. (I93891)
Fehlerkorrekturen
- Der
produceFile
-Parameter fürDataStoreFactory
undPreferenceDataStoreFactory
ist jetzt der letzte Parameter in der Liste. Damit kannst du die Lambda-Syntax nach Kotlin verwenden. (Ibe7f1, b/169425442) - Gemäß den neuen expliziten API-Anforderungen für Kotlin (I5ae1e)
Bekannte Probleme
- Der bevorzugte Datenspeicher stürzt mit
java.lang.NoClassDefFoundError
ab. (b/173036843)
Version 1.0.0-alpha02
14. Oktober 2020
androidx.datastore:datastore-core:1.0.0-alpha02
und androidx.datastore:datastore-preferences:1.0.0-alpha02
wurden veröffentlicht. Version 1.0.0-alpha02 enthält diese Commits.
Fehlerkorrekturen
- Es wurde eine Absicherung gegen Mutation im Datenspeicherkern hinzugefügt. Mutation unterbricht die Datenspeichernutzung für Personen, die den Datenspeicher mit Nicht-Proto- und Nicht-Präferenz-Typen verwenden (I6aa84)
- Die Methode
toString
wurde zu „Preferences.kt“ hinzugefügt, um die Fehlerbehebung zu vereinfachen (I96006). - Ausnahme zum Schutz vor Missbrauch von
DataStore.Preferences
(I1134d) hinzugefügt - Es wurde ein Fehler behoben, durch den die App beim Start abstürzte (I69237, b/168580258).
Version 1.0.0-alpha01
2. September 2020
androidx.datastore:datastore-core:1.0.0-alpha01
und androidx.datastore:datastore-preferences:1.0.0-alpha01
wurden veröffentlicht. Version 1.0.0-alpha01 enthält diese Commits.
Neue Funktionen
Jetpack DataStore ist eine neue und verbesserte Datenspeicherlösung, die SharedPreferences ersetzen soll. DataStore baut auf Kotlin-Koroutinen und Flow auf und bietet zwei verschiedene Implementierungen:
- Proto DataStore zum Speichern typisierter Objekte (unterstützt durch Protokollzwischenspeicher)
- Einstellungen-Datenspeicher, der Schlüssel/Wert-Paare speichert
Die Daten werden asynchron, einheitlich und transaktional gespeichert, was die meisten Nachteile von SharedPreferences hebt.