Bu yazıda , iki DataStore uygulamasından biri olan Preferences DataStore'a bir göz atacağız. Nasıl oluşturulacağını, verilerin nasıl okunacağını ve yazılacağını ve istisnaların nasıl ele alınacağını ele alacağız ; bunların tümü, uygulamanız için doğru seçim olup olmadığına karar vermeniz için size yeterli bilgi sağlamalıdır.
Tercihler DataStore , şemayı önceden tanımlamadan daha küçük veri kümelerini depolamak için anahtar/değer çiftlerini kullanır. Bu size şunu hatırlatabilir
SharedPreferences, ancak yalnızca veri modellerinizi yapılandırdığı şekilde. DataStore'un selefine göre getirdiği çeşitli avantajlar vardır
SharedPreferences. Hızlıca önceki gönderimize geri dönmekten ve orada yaptığımız ayrıntılı karşılaştırmaya bir göz atmaktan çekinmeyin. İleriye dönük olarak , aksi belirtilmedikçe
Preferences DataStorejust olarak bahsedeceğiz.
Preferences
Hızlı bir şekilde özetlemek için:
SharedPreferencesyapmak ve tam tip güvenlik olmadan yeterince güvende hissetmek mi istiyorsunuz? Proto Üzerinden Tercihleri Seçin
Tercihler DataStore codelab kodunu kullanacağız . Uygulamayla ilgili daha pratik bir yaklaşımla ilgileniyorsanız, Tercihlerle Çalışma DataStore kod laboratuvarını kendi başınıza incelemenizi gerçekten öneririz.
Bu örnek uygulama, görevlerin bir listesini görüntüler ve kullanıcı bunları tamamlanmış durumlarına göre filtrelemeyi veya öncelik ve son tarihe göre sıralamayı seçebilir. Seçimlerini depolamak istiyoruz - tamamlanan görevler için bir boole ve DataStore'da bir sıralama düzeni numaralandırma .
Gerekli bağımlılığı ekleyerek başlayalım:
💡 Hızlı ipucu — yapınızı küçültmek istiyorsanız,
proguard-rules.proalanlarınızın silinmesini önlemek için dosyanıza ek bir kural eklediğinizden emin olun:
Bir örneği aracılığıyla DataStore'da kaydedilen verilerle etkileşime girersiniz
DataStore<Preferences>.
DataStorekalıcı bilgilere erişim sağlayan bir arayüzdür. Tercihler , verilerinizin anahtar/değer çiftlerini takip etmek için özellikle DataStore'un Tercihler uygulamasında kullanılan, genel bir Haritaya benzer soyut bir sınıftır.
MutablePreferencesVeri yazmayı tartışırken alt sınıfı hakkında konuşacağız .
Bu örneği oluşturmak için temsilciyi kullanmanız
preferencesDataStoreve zorunlu bir
nameargüman iletmeniz önerilir. Bu temsilci, alıcı türü örneğinin bir örneği olması gereken ve daha sonra DataStore'un verileri depoladığı nesneyi oluşturmak için gerekli olan bir Kotlin uzantısı özelliğidir :
Context
File
Tüm DataStore işlevlerini bozabileceğinden , belirli bir dosya için birden fazla DataStore örneği oluşturmamalısınız . Bu nedenle, delege yapısını Kotlin dosyanızın en üst seviyesinde bir kez ekleyebilir ve onu bir singleton olarak geçirmek için uygulamanız boyunca kullanabilirsiniz . Daha sonraki yazılarda, bunu bağımlılık enjeksiyonu ile nasıl yapacağımızı göreceğiz.
booleanPreferencesKeyDataStore , gibi farklı veri türleri için anahtarlar oluşturmanın hızlı bir yolunu sağlar
intPreferencesKey; anahtar adını değer olarak iletmeniz yeterlidir. Bu, veri türleri üzerinde bazı kısıtlamalar getirse de, kesin tür güvenliği sağlamadığını unutmayın . Belirli bir türde bir tercih anahtarı belirterek, en iyisini umarız ve belirli bir türden bir değerin döndürüleceği varsayımlarımıza güveniriz . Kodunuzun bunu güvenli bir şekilde halledecek şekilde yapılandırıldığını düşünüyorsanız, Tercihler ile devam etmekten çekinmeyin. Değilse, tam tür güvenlik sağladığı için Tercihler'in kardeşi Proto DataStore'u kullanmayı düşünün .
Uygulamamızda
UserPreferencesRepository, kalıcı verilerimizin anahtar/değer çiftlerini yapılandırmak için gereken tüm anahtarları belirtiriz:
Depolanan verileri okumak için,
UserPreferencesRepositorybir
Flow<Preferences>from
dataStore.data. Bu, en son kaydedilen duruma etkin erişim sağlar ve her değişiklikle birlikte yayılır . Kotlin veri sınıflarını kullanarak, yalnızca ilgilendiğimiz anahtar/değer çiftlerini kullanarak herhangi bir emisyonu gözlemleyebilir ve sağlanan DataStore
Preferencesnesnesini kendi modelimize dönüştürebiliriz :
UserPreferences
Akış , diskten okumaya çalışırken her zaman bir değer yayar veya bir istisna atar . Daha sonraki bölümlerde istisna işlemeye bakacağız.
Dispatchers.IODataStore ayrıca , UI iş parçacığınızın engellenmemesi için işin her zaman gerçekleştirilmesini sağlar .
🚨 Tercihler verilerinizin mevcut durumunu yansıtmak için önbellek havuzları oluşturmayın . Bunu yapmak, DataStore'un veri tutarlılığı garantisini geçersiz kılacaktır. Daha fazla Akış emisyonuna abone olmadan verilerinizin tek bir anlık görüntüsüne ihtiyacınız varsa, aşağıdakileri kullanmayı tercih edin :
dataStore.data.first()
DataStore<Preferences>.edit(transform: suspend (MutablePreferences) -> Unit) Veri yazmak için bir askıya alma işlevi kullanacağız . Bunu parçalayalım:
DataStore<Preferences>arayüz — şu anda somut
Preferencesuygulama olarak veri deposunu kullanıyoruz
transform: suspend (MutablePreferences) -> Unit— belirtilen değişiklikleri kalıcı verilerimize uygulamak için kullanılan bir askıya alma bloğu
MutablePreferences— anahtar/değer çiftlerimizde değişiklik yapmamıza izin veren
Preferences, 'ye benzer, değişken bir alt sınıfı
MutableMap
Verilerin düzenlenmesi, atomik bir okuma-değiştirme-yazma işleminde işlemsel olarak yapılır . Bu, verilerin diğer iş parçacıkları için kilitlendiği belirli veri işleme işlemleri sırasının tutarlılığı garanti ettiği ve yarış koşullarını önlediği anlamına gelir . Yalnızca
transformve
editeşyordamları başarıyla tamamlandıktan sonra, veriler kalıcı bir şekilde diske aktarılacak ve
datastore.dataFlow, güncellemeyi yansıtacaktır.
🚨 DataStore durumunda değişiklik yapmanın tek yolunun bu olduğunu unutmayın. Bir referansı tutmak ve tamamlandıktan
MutablePreferencessonra manuel olarak değiştirmek, DataStore'daki kalıcı verileri değiştirmeyecektir , bu nedenle bloğun dışında değişiklik yapmaya çalışmamalısınız .
transform
MutablePreferences
transform
Herhangi bir nedenle yazma işlemi başarısız olursa işlem iptal edilir ve bir istisna atılır.
Uygulamanızda daha önce kullandıysanız
SharedPreferencesve verilerini Tercihler'e güvenle aktarmak istiyorsanız, kullanabilirsiniz
SharedPreferencesMigration. Bir bağlam,
SharedPreferencesad ve taşımak istediğiniz isteğe bağlı bir anahtar kümesi gerektirir (veya yalnızca varsayılan
MIGRATE_ALL_KEYSdeğer olarak bırakın ).
Uygulamaya baktığınızda , tüm gerekli, depolanmış anahtar/değer çiftlerini getirmekten ve ardından bunları aynı anahtarları kullanarak Tercihler'e eklemekten sorumlu olan
SharedPreferencesMigrationbir a göreceksiniz . Kolayca geçiş yapmak için temsilcinin parametresini iletin :
getMigrationFunction()
SharedPreferencesMigration
produceMigrations
preferencesDataStore
produceMigrationsDataStore'a herhangi bir potansiyel veri erişiminden önce
getMigrationFunction() çalıştırılmasını sağlayacaktır . Bu, DataStore daha fazla değer yaymadan ve verilerde herhangi bir yeni değişiklik yapmaya başlamadan önce geçişinizin başarılı olması gerektiği anlamına gelir. Başarılı bir şekilde geçiş yaptıktan sonra , anahtarlar yalnızca bir kez taşınıp ardından .
SharedPreferences
SharedPreferences
produceMigrationslistesini kabul
DataMigrationeder . Bunu diğer veri taşıma türleri için nasıl kullanabileceğimizi sonraki bölümlerde göreceğiz. Geçiş yapmanız gerekmiyorsa, zaten sağlanan bir varsayılana sahip olduğundan bunu yok sayabilirsiniz.
listOf()
DataStore'un ana avantajlarından biri,
SharedPreferencesistisnaları yakalamak ve işlemek için düzgün mekanizmasıdır . Ayrıştırma hatalarını çalışma zamanı istisnaları olarak atarken
SharedPreferences, beklenmeyen, yakalanmayan çökmelere yer bırakırken, DataStore
IOExceptionveri okuma/yazma ile ilgili bir hata oluştuğunda bir atar.
catch()Bunu, Akış operatörünü hemen önce kullanarak
map()ve yayarak güvenli bir şekilde halledebiliriz
emptyPreferences():
Veya yazma üzerine basit bir
try-catchblok ile:
Farklı türde bir istisna atılırsa, yeniden atmayı tercih edin.
DataStore'un Tercihler uygulamasını ele aldık - veri okumak ve yazmak için ne zaman ve nasıl kullanılacağını, hataların nasıl ele alınacağını ve
SharedPreferences. Bir sonraki gönderide, Proto DataStore uygulamasıyla aynı konuları ele alacağız, bu yüzden burada kalın.
Jetpack DataStore serimizdeki tüm gönderileri burada bulabilirsiniz:
Jetpack DataStore'a Giriş
Tercihler Hakkında Her Şey DataStore
Proto DataStore
DataStore ve bağımlılık ekleme hakkında her şey
DataStore ve Kotlin serileştirme
DataStore ve senkronize çalışma
DataStore ve veri taşıma
DataStore ve test
26 Temmuz'da Kilise, Meryem Ana'nın ebeveynleri olan Aziz Joachim ve Anne'yi inançları ve azimleri için anıyor. İşte ailemin hikayesi - hayatlarını sadelik içinde yaşayan ve bize yedi çocuğuna yaşam boyu eğitim veren basit bir çift.
Arka hikaye Her ürünün bir hikayesi vardır ve bu Yapdoof'un başlangıç hikayesidir. Yapdoof, Omept Technology Nijerya Limited'in bir ürünüdür.
Abha'da spor aktiviteleri için bir deneyim tasarlayalım! Programın neredeyse yarısına geldik ve 3. proje zamanı geldi! Yalan söylemeyeceğim bu proje şimdiye kadar yaptığım en bunaltıcı, stresli ama eğlenceli proje olabilir. Başlamak için, güzel Abha şehrinde spor aktiviteleri için bir deneyim tasarlamak olan meydan okumamızla tanıştık.
Bu makalenin bir okumasını dinleyin: ❖ Tüm yaşamları boyunca çok önemli bir şey hakkında yanlış yönlendirilmiş kahramanlar hakkında hikayeler nesillerdir kültürümüzde ortaya çıkıyor ve bu güne kadar gişede izleyicileri memnun etmeye devam ediyor. Yoksul gerçekten bir prensti.
1.Nörogenez, sinirsel düzenleyici gibi davranabilir mi?(biorXiv) Yazar : Lina M.
İster NFT'lerde yeni olun, ister sahnenin emektarı olun, burada anlattıklarımın faydalı olabileceğini umuyorum. Bu seri, "projelerin" herkesi kendilerine bir miktar para kazandırmak için manipüle etmek için kullandıkları özenle tasarlanmış yöntemleri ortaya çıkarmayı amaçlıyor.