مقالات

آموزش دیتا استور (Data Store) در اندروید

دیتا استور در اندروید یک کتابخانه جدید برای ذخیره داده‌های کوچک و ساده است که توسط Google معرفی شده است. این کتابخانه جایگزینی برای SharedPreferences است و امکانات بیشتری برای ذخیره و بازیابی داده‌ها در اختیار برنامه‌نویسان قرار می‌دهد. دیتا استور روش‌هایی را برای ذخیره داده‌ها در فضای ذخیره‌سازی سازگار با عملکرد نیتیو و امن فراهم می‌کند.

 

 

“ما را در اینستاگرام دنبال کنید”

در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد دیتا استور در اندروید ، صحبت کنیم. پس با سایت ترولرن همراه باش.

“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”

توی دوره ژنرال صفر تا صد دیتا استور در اندروید رو در یک فصل کامل توضیح دادیم و همچنین توی پروژه های دیجی کالا و اسنپ فود به صورت عملی و پروژه محور از دیتا استور استفاده کردیم و بطور کامل اون رو آموزش دادیم.

دیتا استور در اندروید چیست؟

دیتا استور در اندروید یک راه انتخابی برای ذخیره داده‌ها است که توسط Jetpack معرفی شده است. این کتابخانه برای ذخیره داده‌های مؤقت و کوچک در اندروید به کار می‌رود و به جای استفاده از SharedPreferences، یک راه برای پیاده‌سازی بهتر و امن‌تر فراهم می‌کند.

DataStore دو نوع اصلی دارد:

Preferences DataStore

این نوع DataStore، یک سیستم ذخیره‌سازی key-value برای داده‌های کوچک و مؤقت فراهم می‌کند. این داده‌ها در یک فایل XML ذخیره می‌شوند و می‌توان به آنها از طریق یک شیء Preferences دسترسی پیدا کرد. با استفاده از Preferences DataStore، می‌توانید ترجیحات کاربر را ذخیره کنید و داده‌های کوچک و مرتبط با نمایشگر را پیگیری کنید.

Proto DataStore

این نوع DataStore از پروتکل Protocol Buffers برای ذخیره داده‌ها استفاده می‌کند. این نوع DataStore مناسب برای ذخیره داده‌های پیچیده‌تر و ساختار دار است که نیاز به تغییرات ساختاری در آینده دارند. با Proto DataStore، می‌توانید داده‌های ساختاری مانند لیست‌ها، شیء‌های تو در تو و داده‌های سفارشی را ذخیره کنید.

DataStore از مزایایی مانند امنیت بیشتر (بدون نیاز به کلید‌های ثابت)، کارایی بهتر (بدون نیاز به خواندن کل فایل مانند SharedPreferences) و پشتیبانی از تغییرات ساختاری در آینده برخوردار است. همچنین، DataStore با Jetpack Compose و Flow سازگار است و امکان استفاده آسان از آن در برنامه‌هایی که از این ابزارها استفاده می‌کنند را فراهم می‌کند.

با در نظر گرفتن پیچیدگی داده‌های خود و نیازهای ذخیره‌سازی، می‌توانید بین SharedPreferences و DataStore یکی را انتخاب کنید. در صورتی که نیاز به پشتیبانی از نوع‌های داده‌ای پیچیده‌تر، امنیت بیشتر و پشتیبانی از تغییرات ساختاری در آینده دارید، DataStore یک گزینه مناسب تر خواهد بود.

مزایای استفاده از دیتا استور در اندروید در مقایسه با SharedPreferences:

امنیت بالا

دیتا استور از جنسی مانند ProtoBuf برای ذخیره داده‌ها استفاده می‌کند که امکان رمزنگاری آنها را فراهم می‌کند. این امر اطمینان حاصل می‌کند که اطلاعات حساس شما در دیتا استور به درستی محافظت می‌شود.

سازگاری با عملکرد نیتیو

دیتا استور از عملکرد Coroutines در کاتلین بهره می‌برد و امکان استفاده از عملکردهای suspend و Flow را فراهم می‌کند. این کار باعث می‌شود که عملیات دسترسی به دیتا استور به صورت غیرقابل بلاکه شونده و بهینه‌سازی شده انجام شود.

پشتیبانی از تغییرات پیچیده

دیتا استور از مفهومی به نام PreferencesDataStore استفاده می‌کند که امکان ذخیره و بازیابی ساختارهای پیچیده‌تر از اطلاعات را فراهم می‌کند. شما می‌توانید از نوع‌های داده‌ای مانند Boolean، Int، Float، Long، Double، String و Set<String> استفاده کنید.

تطابق با Jetpack

دیتا استور به خوبی با سایر اجزای Jetpack مانند ViewModel، LiveData و Flow سازگاری دارد. این امر به شما امکان می‌دهد تا داده‌های ذخیره شده را به صورت نمایشی در برنامه خود استفاده کنید و به راحتی تغییرات را پیگیری کنید.

 

 

با استفاده از Jetpack DataStore در یک پروژه Kotlin MVVM با Jetpack Compose و Flow، می‌توانید دیتا را ذخیره و بازیابی کنید.

در زیر یک مثال از استفاده از DataStore با Jetpack Compose و Flow در اندروید آورده شده است:

ابتدا وابستگی مربوط به Jetpack DataStore را در فایل build.gradle ماژول خود اضافه کنید. در قسمت dependencies، خط زیر را اضافه کنید:

implementation "androidx.datastore:datastore-preferences:1.0.0"

در بخش ViewModel خود، یک متغیر نمونه از DataStore را ایجاد کنید. به عنوان مثال:

class MyViewModel(private val dataStore: DataStore<Preferences>) : ViewModel() {
    // ...
}

در ViewModel خود، یک تابع برای ذخیره دیتا در DataStore ایجاد کنید. به عنوان مثال:

suspend fun saveDataToDataStore(data: String) {
    dataStore.edit { preferences ->
        preferences[PreferencesKeys.DATA_KEY] = data
    }
}

در این مثال، PreferencesKeys.DATA_KEY یک کلید است که برای ذخیره داده در DataStore استفاده می‌شود.

در ViewModel خود، یک تابع برای بازیابی دیتا از DataStore ایجاد کنید. به عنوان مثال:

fun getDataFromDataStore(): Flow<String> = dataStore.data
    .map { preferences ->
        preferences[PreferencesKeys.DATA_KEY] ?: ""
    }

در اینجا، getDataFromDataStore یک جریان (Flow) از String بازمی‌گرداند که مقدار دیتا را از DataStore می‌خواند. از map برای تبدیل داده‌های Preferences به String استفاده می‌کنیم و اگر داده وجود نداشته باشد، مقدار پیش‌فرض را برمی‌گردانیم (در اینجا رشته خالی “”).

در Composable مربوطه (مثلاً یک صفحه)، از ViewModel استفاده کنید تا دیتا را بازیابی کنید و نمایش دهید. به عنوان مثال:

@Composable
fun MyScreen(viewModel: MyViewModel) {
    val data by viewModel.getDataFromDataStore().collectAsState()

    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = data)
    }
}

در این مثال، از getDataFromDataStore در viewModel برای بازیابی دیتا استفاده می‌کنیم. با استفاده از collectAsState، دیتا را به عنوان یک وضعیت (state) در Composable نگهداری می‌کنیم تا هر زمان که دیتا تغییر کند، نمایش داده شود.

در Composable مربوطه، از یک LaunchedEffect برای ذخیره دیتا در DataStore استفاده کنید. به عنوان مثال:

@Composable
fun MyScreen(viewModel: MyViewModel) {
    val data by viewModel.getDataFromDataStore().collectAsState()
    
    // ...

    LaunchedEffect(data) {
        viewModel.saveDataToDataStore(data)
    }
}

در اینجاما از LaunchedEffect استفاده می‌کنیم تا زمانی که دیتا تغییر کند، تابع saveDataToDataStore را صدا بزنیم و دیتا را در DataStore ذخیره کنیم.

این مثال یک نمونه ساده از استفاده از Jetpack DataStore با کتابخانه Jetpack Compose و Flow در یک پروژه Kotlin MVVM است. با استفاده از این مثال، شما می‌توانید دیتای خود را در DataStore ذخیره و بازیابی کنید و آن را با استفاده از Jetpack Compose و Flow در رابط کاربری خود نمایش دهید. البته توجه داشته باشید که برای استفاده از Jetpack DataStore، باید کد خود را بر اساس ورژن‌های جدیدتر Jetpack و Compose به‌روز کنید و ممکن است متغیرها و توابع وابسته به DataStore تغییر کنند.

ذخیره و بازیابی داده‌های پیچیده‌تر

با استفاده از Jetpack DataStore می‌توانید داده‌های پیچیده‌تر را نیز ذخیره و بازیابی کنید. DataStore از نوع key-value است که مقادیر key و value می‌توانند هر نوع داده‌ای باشند. در زیر چند مثال از استفاده از DataStore برای ذخیره و بازیابی داده‌های پیچیده‌تر آورده شده است:

ذخیره و بازیابی یک لیست از رشته‌ها:

suspend fun saveStringListToDataStore(stringList: List<String>) {
    dataStore.edit { preferences ->
        preferences[PreferencesKeys.STRING_LIST_KEY] = stringList
    }
}

fun getStringListFromDataStore(): Flow<List<String>> = dataStore.data
    .map { preferences ->
        preferences[PreferencesKeys.STRING_LIST_KEY] ?: emptyList()
    }

در این مثال، PreferencesKeys.STRING_LIST_KEY یک کلید است که برای ذخیره و بازیابی لیستی از رشته‌ها در DataStore استفاده می‌شود.

ذخیره و بازیابی یک شیء سفارشی:

data class User(val name: String, val age: Int)

suspend fun saveUserToDataStore(user: User) {
    dataStore.edit { preferences ->
        preferences[PreferencesKeys.USER_KEY] = Gson().toJson(user)
    }
}

fun getUserFromDataStore(): Flow<User?> = dataStore.data
    .map { preferences ->
        val jsonString = preferences[PreferencesKeys.USER_KEY]
        Gson().fromJson(jsonString, User::class.java)
    }

در اینجا، یک شیء سفارشی به نام User داریم که شامل دو فیلد name و age است. ما از کتابخانه Gson برای تبدیل شیء User به رشته JSON و بالعکس استفاده می‌کنیم تا آن را به عنوان یک رشته در DataStore ذخیره کنیم و از آن بازیابی کنیم.

موارد دیگری مانند ذخیره و بازیابی لیست از شیء‌های سفارشی، مقادیر بولین، عددی و غیره نیز می‌توانند با استفاده از DataStore انجام شوند. شما می‌توانید نوع داده‌ها را بر اساس نیاز خود تعریف کنید و مقادیر را در DataStore ذخیره و بازیابی کنید.

برای داده‌های پیچیده‌تر، می‌توانید از روش‌های دیگری مانند تبدیل داده به رشته JSON (با استفاده از کتابخانه‌هایی مانند Gson یا Moshi) یا استفاده از Serializable برای ذخیره و بازیابی اشیاء سفارشی استفاده کنید.

با استفاده از Jetpack DataStore و ترکیب آن با ابزارهای دیگر مانند Gson یا Moshi، می‌توانید داده‌های پیچیده و ساختارهای متنوع را در اندروید ذخیره و بازیابی کنید.

و همچنین ممنون میشم از طریق ستاره‌های این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.

‫5/5 ‫(2 نظر)
عاطفه امیری

Recent Posts

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید: راهنمای جامع و کاربردی

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید یکی از مهم‌ترین فاکتورهایی است که برای کاربران در دنیای امروز…

4 ماه ago

سوالات مصاحبه‌ی استخدامی کاتلین همراه با جواب(قسمت چهارم)

مصاحبه‌ی استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

4 ماه ago

سوالات مصاحبه استخدام زبان کاتلین همراه با جواب(قسمت سوم)

مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه…

4 ماه ago

سوالات مصاحبه استخدام کاتلین همراه با جواب(قسمت دوم)

مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

سوالات مصاحبه استخدامی کاتلین همراه با جواب(قسمت اول)

مصاحبه استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

نوتیفیکیشن در اندروید: نحوه کار با آن در کاتلین

نوتیفیکیشن در اندروید امروزه یکی از قابلیت‌های مهم و پرکاربرد در اپلیکیشن‌های اندروید هستند. با…

5 ماه ago