آموزش استفاده از Jetpack DataStore

سلام دوستان

من مدت‌ها قصد داشتم توی ویرگول خودم نوشتن رو شروع کنم اما به دلایل مختلفی هیچوقت تا الان نشد که این اتفاق بیفته! تا اینکه چند روز پیش خبر منتشر شدن کتابخونه‌ی جدید DataStore که بخشی از مجموعه‌ی Jetpack هست رو خوندم.

از اونجایی که این کتابخونه مزایای بسیار زیادی نسبت به SharedPreferences داره، و آموزش فارسی برای پیاده‌سازیش هنوز منتشر نشده(یعنی من ندیدم?)، تصمیم گرفتم این مقاله رو بنویسم.

پس خیلی حرف نمی‌زنم و میرم سر اصل مطلب.


کتابخونه‌ی DataStore عضو جدیدی از خانواده‌ی Jetpack هست که بر پایه‌ی Kotlin coroutines و Flow ساخته شده و به عنوان جایگزین SharedPreferences معرفی شده.


چرا DataStore؟ مگه SharedPreferences چشه؟!


خب قبل اینکه بخوام بگم چرا، این جدول مقایسه رو ببینید:

SharedPreferences VS DataStore
SharedPreferences VS DataStore


خب حالا وقت جواب دادنه! معایب SharedPreferences که توی DataStore رفع شدن:

  • اول اینکه SharedPreferences دارای یک API همزمانی (synchronous API) هستش، که به نظر می‌رسه برای صدا زده شدن توی ترد اصلی برنامه (UI Thread) امن باشه، اما در واقع عملیات I/O دیسک رو انجام میده. علاوه بر اون، متد apply ترد اصلی رو روی متد fsync بلاک می‌کنه (برای نوشتن اطلاعات روی حافظه‌ی دستگاه). این یعنی هر موقع یک سرویس یا اکتیویتی در اپلیکیشن شما start/stop میشه، fsync هایی که pending هستن اجرا میشن و در تمام این مواقع، حین اجرای fsync ها، ترد UI بلاک میشه.
  • به دلیل پشتیبانی نکردن از type safety می‌تونه parsing error یا runtime exception پرتاب کنه و باعث ایجاد مشکل یا کرش در برنامه‌ی ما بشه.
  • از پیگیری کردن وضعیت(success / failure) یک job پشتیبانی نمی‌کنه.
  • فقط از داده‌های اولیه(primitive types) پشتیبانی می‌کنه.


نکته مهم:

اگه به به‌روزرسانی‌های جزئی، یکپارچگی دسترسی به اطلاعات یا پشتیبانی از مجموعه داده‌های بزرگ یا پیچیده نیاز دارید بهتره (و باید) از Room استفاده کنید. DataStore برای مجموعه داده‌های ساده و کوچک ایده‌آل هست، مثل ذخیره تنظیمات یا اطلاعات کاربری جزئی در نرم‌افزار.




روش پیاده‌سازی

اینجا فعلا روش پیاده‌سازی بدون Proto رو آموزش میدم که مقاله خیلی طولانی و حوصله سر بر نشه :)


۱. اضافه کردن dependency به build.gradle:

// Preferences DataStore
implementation &quotandroidx.datastore:datastore-preferences:1.0.0-alpha01&quot


۲. ساختن دیتااستور:

// with Preferences DataStore
val dataStore: DataStore<Preferences> = context.createDataStore(
    name = &quotsettings&quot //نام دلخواه
)


۳. ذخیره‌ی اطلاعات در دیتااستور:

dataStore.edit {preferences ->
 preferences[KEY] = value
}

به جای KEY باید کلید مربوطه و به جای value مقدار اون رو قرار بدید، مثلا:

KEY: &quotlanguage&quot
value: &quotfa&quot


۴. خواندن اطلاعات ذخیره شده:

val language: Flow<String?>
    get() = dataStore.data.map { preferences ->
        preferences[KEY]
    }

بالاتر گفتم که این کتابخونه بر پایه‌ی Kotlin coroutines و Flow ساخته شده، پس باید برای خوندن اطلاعات نوع متغیر رو به صورت بالا تعریف کنیم، و داخل تابع getter دیتای مربوط به KEY دلخواه خودمون رو دریافت کنیم.


تبریک می‌گم، شما DataStore رو با موفقیت پیاده‌سازی کردین :)




اگر قصد مهاجرت از SharedPreferences به DataStore رو دارید و میخواید دیتای قدیمی رو به دیتااستور منتقل کنید، کافیه کد زیر رو (قبل از انجام هر عملیاتی با DataStore) بنویسید:

val dataStore: DataStore<Preferences> = context.createDataStore(
    name = &quotsettings&quot // نام دلخواه,
    migrations = listOf(SharedPreferencesMigration(context, &quotsettings_preferences&quot))
)


امیدوارم این مقاله براتون مفید بوده باشه.

موفق‌تر باشید ❤


منبع: Prefer Storing Data with Jetpack DataStore