DataStore: یہ کیا ہے، ڈیٹا ذخیرہ کرنے کی بنیادی باتیں اور SharedPreferences کا متبادل

مصنف: IT Sectr اشاعت: 2026-03-12 مطالعے کا وقت: 9 منٹ

DataStore Jetpack لائبریری کا ایک جزو ہے جو Android ایپلیکیشنز میں ڈیٹا کی چھوٹی مقدار کو ذخیرہ کرنے کے لیے ڈیزائن کیا گیا ہے۔ SharedPreferences کے برعکس، یہ غیر متزامن طور پر کام کرتا ہے اور متوازی رسائی کے تحت ڈیٹا کی مستقل مزاجی کی ضمانت دیتا ہے۔ Google، 2024 کے مطابق، DataStore Kotlin Coroutines اور Flow استعمال کرتا ہے، جو اسے مرکزی تھریڈ کے لیے محفوظ اور رد عمل والے فن تعمیر کے لیے موزوں بناتا ہے۔

اہم نکات

  • DataStore — غیر متزامن API اور Protocol Buffers کے ذریعے ڈیٹا کی اقسام کے ساتھ SharedPreferences کا متبادل
  • Preferences DataStore — Flow اور ٹرانزیکشنز کے ذریعے پڑھنے کے ساتھ سادہ کلید-قدر ذخیرہ
  • Proto DataStore — خودکار اسکیما منتقلی کے ساتھ ٹائپ شدہ ذخیرہ
  • SharedPreferences — مطابقت پذیر API جو بڑی مقدار میں UI-تھریڈ کو روکتا ہے
  • منتقلی SharedPreferencesMigration انٹرفیس کے ذریعے ڈیٹا کے نقصان کے بغیر انجام دی جاتی ہے

DataStore کیا ہے؟

DataStore Android میں مقامی ڈیٹا ذخیرہ کرنے کے لیے Google کا حل ہے، جو 2020 میں SharedPreferences کے متبادل کے طور پر پیش کیا گیا۔ یہ دو طریقوں کو سپورٹ کرتا ہے: Preferences DataStore (سادہ کلید-قدر جوڑے) اور Proto DataStore (Protocol Buffers پر مبنی ٹائپ شدہ اسکیما)۔

بنیادی فائدہ مکمل غیر متزامنیت ہے: تمام پڑھنے کی کارروائیاں Kotlin Coroutines سے Flow لوٹاتی ہیں، اور تحریریں coroutine-سیاق میں انجام دی جاتی ہیں۔ یہ مرکزی تھریڈ کی رکاوٹ کو ختم کرتا ہے، جو بڑی مقدار میں ڈیٹا کے ساتھ کام کرتے وقت SharedPreferences کا ایک عام مسئلہ تھا۔

DataStore کارروائیوں کی جوہریت کی ضمانت دیتا ہے: متوازی تحریریں اس کے لین دین کے ماڈل کی وجہ سے ڈیٹا کے نقصان کا سبب نہیں بنتیں۔ اگر دو اجزاء ایک ہی وقت میں ایک ہی قدر کو تبدیل کرتے ہیں، تو DataStore compare-and-swap میکانزم کے ذریعے تنازع کو صحیح طریقے سے سنبھالتا ہے۔

Google I/O 2023 کے مطابق، DataStore 40% نئے Android پروجیکٹس میں استعمال ہوتا ہے، اور Google ان تمام ایپلیکیشنز میں SharedPreferences سے منتقلی کی سفارش کرتا ہے جہاں ترتیبات کے ذخیرہ کے استحکام کی ضرورت ہو۔

DataStore کا فن تعمیر

DataStore کے مرکز میں SingleProcessDataStore ہے — ایک نفاذ جو ایک عمل کے اندر کام کرتا ہے۔ یہ فائل لاکنگ کے ساتھ فائل پر مبنی ذخیرہ استعمال کرتا ہے: ڈیٹا لکھتے وقت، فائل لاک ہو جاتی ہے، متوازی رسائی کے تحت خرابی کو روکتا ہے۔

DataStore خود بخود ڈی سیریلائزیشن کی غلطیوں کو سنبھالتا ہے: اگر فائل خراب ہے، تو یہ ایک ڈیفالٹ قدر لوٹاتا ہے اور فائل کو اوور رائٹ کرتا ہے۔ یہ رویہ corruptionHandler کے ذریعے ترتیب پذیر ہے، جسے DataStore بناتے وقت سیٹ کیا جا سکتا ہے۔

SharedPreferences کے مسائل جو DataStore حل کرتا ہے

SharedPreferences تین بنیادی مسائل کا شکار ہے: مرکزی تھریڈ پر مطابقت پذیر ڈسک پڑھنا، متوازی تحریروں کے لیے جوہریت کی ضمانتوں کا فقدان، اور تبدیلیوں کو رد عمل کے ساتھ ٹریک کرنے میں ناکامی۔ DataStore تینوں کو حل کرتا ہے: مشاہدے کے لیے Flow، جوہریت کے لیے فائل لاکنگ، اور تھریڈ سیفٹی کے لیے غیر متزامن API۔

Android میں DataStore کیسے کام کرتا ہے؟

DataStore ڈیوائس کی اندرونی اسٹوریج میں فائلوں میں ڈیٹا ذخیرہ کرتا ہے۔ Preferences DataStore SharedPreferences جیسا فائل فارمیٹ استعمال کرتا ہے لیکن سالمیت کی جانچ کے لیے اضافی میٹا ڈیٹا کے ساتھ۔ Proto DataStore بائنری Protocol Buffers فارمیٹ استعمال کرتا ہے، جو فائل کا سائز کم کرتا ہے اور سیریلائزیشن کو تیز کرتا ہے۔

ڈیٹا پڑھتے وقت، DataStore پوری فائل کو ایک بار میموری میں لوڈ کرتا ہے، جس کے بعد سبسکرائبرز Flow کے ذریعے موجودہ حالت حاصل کرتے ہیں۔ تبدیلیاں تمام فعال سبسکرائبرز کو خود بخود نشر کی جاتی ہیں — SharedPreferences کی طرح دستی سننے والے رجسٹریشن کی ضرورت نہیں۔

Preferences DataStore کیسے کام کرتا ہے

Preferences DataStore Map پر مبنی ایک بلٹ ان سیریلائزیشن میکانزم استعمال کرتا ہے۔ ہر اندراج ایک سٹرنگ اور ایک قدیم قسم (Int, Boolean, Float, Long, String, Set) کا جوڑا ہے۔ ڈیٹا SharedPreferences کی طرح XML فائل میں محفوظ کیا جاتا ہے، لیکن فائل لاکنگ کے ذریعے جوہری تحریر کے ساتھ۔

Preferences DataStore بنانے کی مثال: Context پر preferencesDataStore ایکسٹینشن فائل نام کے ساتھ ایک سنگلٹن بناتا ہے۔ بار بار کال کرنے پر، وہی مثال لوٹائی جاتی ہے — یہ فائل کی نقل اور مختلف اسٹوریج مثالوں کے درمیان الجھن کو ختم کرتا ہے۔

Proto DataStore کیسے کام کرتا ہے

Proto DataStore کو .proto فائل کے ذریعے ڈیٹا اسکیما کی تعریف اور protobuf پلگ ان کے ساتھ کمپائلیشن کی ضرورت ہوتی ہے۔ تیار کردہ Java کلاس تمام فیلڈز کے لیے واحد داخلے کے مقام کے طور پر استعمال ہوتی ہے — یہ SharedPreferences میں عام کلیدی ٹائپو غلطیوں کو ختم کرتی ہے۔

Proto DataStore اسکیما ایک بار متعین کیا جاتا ہے اور پرانے ڈیٹا کو کھوئے بغیر نئے فیلڈز شامل کرنے کی حمایت کرتا ہے۔ اگر ایپ کا نیا ورژن ڈیفالٹ قدر کے ساتھ ایک فیلڈ شامل کرتا ہے، تو پرانی فائل صحیح طریقے سے ڈی سیریلائز ہو جائے گی — پسماندہ مطابقت پروٹوکول میں شامل ہے۔

Preferences DataStore اور Proto DataStore: موازنہ

Preferences DataStore اور Proto DataStore کے درمیان انتخاب کا انحصار ڈیٹا کی پیچیدگی اور ٹائپنگ کی ضروریات پر ہے۔ دونوں اختیارات غیر متزامن اور لین دین والے ہیں، لیکن قسم کی حفاظت اور سیریلائزیشن کی کارکردگی میں مختلف ہیں۔

خصوصیتPreferences DataStoreProto DataStore
ٹائپنگکمزور (کلید-قدر)مضبوط (تیار کردہ کلاس)
سیریلائزیشنXML (بلٹ ان)Protocol Buffers (protobuf)
فائل کا سائزبڑا (پڑھنے کے قابل XML)چھوٹا (بائنری)
پیچیدگیکم (.proto کے بغیر)درمیانی (.proto ضروری)
اسکیما منتقلیکوئی اسکیما نہیںخودکار (proto)
مطابقتSharedPreferences (منتقلی کے ذریعے)صرف Proto DataStore

Preferences DataStore کب منتخب کریں

Preferences DataStore سادہ ترتیبات کے لیے موزوں ہے: فیچر فلیگ، اجازت نامہ ٹوکن سٹرنگ، ایپ لانچ کی تعداد۔ اگر ڈیٹا کم ہے (10–15 کلیدوں تک) اور سخت اسکیما کی ضرورت نہیں ہے، تو Preferences DataStore protobuf پلگ ان کو جوڑے بغیر کم سے کم داخلے کی حد فراہم کرتا ہے۔

Proto DataStore کب منتخب کریں

Proto DataStore اس وقت جائز ہے جب ڈیٹا کا ڈھانچہ پیچیدہ ہو یا ایپ کے ورژنز کے درمیان تبدیل ہو سکے۔ مثال کے طور پر، صارف پروفائل کی ترتیبات یا 20+ فیلڈز کے ساتھ A/B ٹیسٹ کنفیگریشن۔ Protobuf مضبوط ٹائپنگ اور خودکار منتقلی فراہم کرتا ہے، کلیدی عدم مماثلت کی وجہ سے رن ٹائم کی غلطیوں کو ختم کرتا ہے۔

SharedPreferences سے DataStore میں منتقلی کیسے کریں

Google SharedPreferencesMigration کلاس کے ذریعے ایک بلٹ ان منتقلی میکانزم فراہم کرتا ہے۔ منتقلی ایپ اپ ڈیٹ کے بعد پہلی لانچ پر ایک بار انجام دی جاتی ہے: DataStore SharedPreferences سے ڈیٹا پڑھتا ہے، اسے اپنے فارمیٹ میں لکھتا ہے، اور منتقلی کو مکمل قرار دیتا ہے۔

منتقلی حسب ضرورت تبدیلیوں کی حمایت کرتی ہے: اگر SharedPreferences میں موجود کلیدیں مطلوبہ DataStore کلیدوں سے مماثل نہیں ہیں، تو آپ SharedPreferencesMigration کے ذریعے ایک تبدیلی فنکشن بتا سکتے ہیں۔ یہ منتقلی کے دوران کلیدوں کا نام تبدیل کرنے اور ڈیٹا کی اقسام تبدیل کرنے کی اجازت دیتا ہے۔

مرحلہ وار منتقلی

پہلا، build.gradle میں DataStore شامل کریں اور منتقلی کے ساتھ DataStore مثال بنائیں: SharedPreferencesMigration SharedPreferences فائل کا نام اور منتقل کرنے کے لیے کلیدوں کا سیٹ قبول کرتا ہے۔ دوسرا، SharedPreferences کے ذریعے کام کرنے والے تمام کوڈ کو ہٹا دیں اور DataStore کالز سے تبدیل کریں۔ تیسرا، منتقلی کی جانچ کریں: پہلی لانچ پر، ڈیٹا DataStore میں ظاہر ہونا چاہیے اور پرانی SharedPreferences فائل مزید استعمال نہیں ہونی چاہیے۔

kotlin
val Context.dataStore by preferencesDataStore(
    name = "settings",
    produceMigrations = { context ->
        listOf(
            SharedPreferencesMigration(context, "old_prefs")
        )
    }
)

کوڈ میں DataStore استعمال کرنے کی مثالیں

DataStore موجودہ پروجیکٹ میں آسانی سے ضم ہو جاتا ہے۔ ذیل میں Preferences DataStore اور Proto DataStore کے لیے عملی مثالیں دی گئی ہیں — دونوں ڈیٹا کو پڑھنے، لکھنے اور رد عمل کے ساتھ مشاہدہ کرنے کا مظاہرہ کرتے ہیں۔

Preferences DataStore: ترتیبات پڑھنا اور لکھنا

اس مثال میں، Preferences DataStore تین ترتیبات محفوظ کرتا ہے: ڈارک تھیم، صارف نام، اور لانچ کی تعداد۔ پڑھنا .data ایکسٹینشن کے ذریعے کیا جاتا ہے، جو Flow لوٹاتا ہے۔ لکھنا .edit معطل فنکشن کے ذریعے کیا جاتا ہے، جو تبدیلیوں کی جوہریت کی ضمانت دیتا ہے۔

kotlin
val Context.settingsDataStore by preferencesDataStore(name = "settings")

val isDarkMode: Flow<Boolean> = settingsDataStore.data
    .map { preferences ->
        preferences[booleanPreferencesKey("dark_mode")] ?: false
    }

suspend fun toggleDarkMode() {
    settingsDataStore.edit { prefs ->
        val current = prefs[booleanPreferencesKey("dark_mode")] ?: false
        prefs[booleanPreferencesKey("dark_mode")] = !current
    }
}

Proto DataStore: اسکیما اور استعمال

Proto DataStore کو .proto فائل کی تعریف کی ضرورت ہوتی ہے۔ کمپائلیشن کے بعد، ایک UserSettings کلاس بنتی ہے جو پڑھنے اور لکھنے کے لیے استعمال ہوتی ہے۔ اسکیما کے ورژن کی منتقلی اسی .proto فائل میں بیان کی جاتی ہے اور خود بخود لاگو ہوتی ہے۔

kotlin
// user_preferences.proto
syntax = "proto3";

message UserPreferences {
    string display_name = 1;
    int32 notification_count = 2;
    bool notifications_enabled = 3;
}

// DataStore سے پڑھنا
val userPreferencesFlow: Flow<UserPreferences> =
    protoDataStore.data

// نئی قدریں لکھنا
suspend fun updateDisplayName(name: String) {
    protoDataStore.updateData { prefs ->
        prefs.toBuilder()
            .setDisplayName(name)
            .build()
    }
}

تبدیلیوں کا رد عمل کے ساتھ مشاہدہ

DataStore ViewModel کے ذریعے MVVM فن تعمیر کے ساتھ ضم ہوتا ہے۔ DataStore سے Flow .stateIn کے ذریعے جمع کیا جاتا ہے اور UI میں استعمال ہوتا ہے۔ ہر ڈیٹا تبدیلی کے ساتھ، UI خود بخود اپ ڈیٹ ہوتا ہے — دستی اپ ڈیٹس یا LiveData کی ضرورت نہیں۔

kotlin
class SettingsViewModel(
    private val dataStore: DataStore<Preferences>
) : ViewModel() {

    val uiState: StateFlow<SettingsUiState> =
        dataStore.data
            .map { prefs ->
                SettingsUiState(
                    isDarkMode = prefs[booleanPreferencesKey("dark_mode")] ?: false,
                    counter = prefs[intPreferencesKey("launch_count")] ?: 0
                )
            }
            .stateIn(
                scope = viewModelScope,
                started = SharingStarted.WhileSubscribed(5000),
                initialValue = SettingsUiState()
            )
}

اکثر پوچھے گئے سوالات

DataStore SharedPreferences سے کیسے بہتر ہے؟

DataStore غیر متزامن طور پر کام کرتا ہے (UI تھریڈ کو مسدود نہیں کرتا)، لین دین کے ذریعے متوازی رسائی کو سپورٹ کرتا ہے، اور Flow کے ذریعے تبدیلیوں کی رد عمل کے ساتھ سبسکرپشن کی اجازت دیتا ہے۔ SharedPreferences ایک مطابقت پذیر API ہے جس میں بڑے ڈیٹا والیوم میں ANR کا خطرہ ہے اور کوئی بلٹ ان ری ایکٹیویٹی سپورٹ نہیں ہے۔

کیا DataStore Java کے ساتھ استعمال کیا جا سکتا ہے؟

DataStore Kotlin میں لکھا گیا ہے اور Kotlin Coroutines کی ضرورت ہے۔ Java سے استعمال ممکن ہے لیکن تکلیف دہ: آپ کو CompletableFuture کے ساتھ ریپر بنانے ہوں گے یا دستی طور پر coroutines کا انتظام کرنا ہوگا۔ Java پروجیکٹس کے لیے، Google SharedPreferences رکھنے یا ماڈیول میں Kotlin شامل کرنے کی سفارش کرتا ہے۔

کیا DataStore ڈیٹا کی بڑی مقدار ذخیرہ کرنے کے لیے موزوں ہے؟

DataStore پڑھتے وقت پوری فائل کو میموری میں لوڈ کرتا ہے، لہذا یہ فہرستوں یا بڑی اشیاء کو ذخیرہ کرنے کے لیے موزوں نہیں ہے۔ ایسے منظرناموں کے لیے، Room یا SQLite استعمال کریں۔ DataStore ترتیبات اور چھوٹے ساختہ ڈیٹا — سینکڑوں کلو بائٹس تک — کے لیے بہتر بنایا گیا ہے۔

خراب DataStore فائل کی غلطی کو کیسے ہینڈل کریں؟

DataStore بناتے وقت، آپ ایک corruptionHandler پاس کر سکتے ہیں — ایک فنکشن جو فائل کے خراب ہونے پر کال کیا جاتا ہے۔ ڈیفالٹ طور پر، DataStore ایک CorruptionException پھینکتا ہے۔ corruptionHandler میں، آپ خالی ڈیٹا لوٹا سکتے ہیں، جس کے بعد DataStore فائل کو صحیح حالت میں اوور رائٹ کرے گا۔

کیا Proto DataStore کے لیے .proto فائل ضروری ہے؟

ہاں، Proto DataStore کو .proto فائل میں اسکیما کی تعریف اور protobuf-gradle-plugin کو جوڑنے کی ضرورت ہے۔ اگر پروجیکٹ چھوٹا ہے اور ڈیٹا سادہ ہے، تو Preferences DataStore استعمال کرنا آسان ہے — اسے اضافی بلڈ کنفیگریشن کی ضرورت نہیں ہے۔

خلاصہ

  • DataStore — Kotlin Coroutines اور Flow کے ساتھ کام کرنے والا SharedPreferences کا جدید متبادل
  • Preferences DataStore — اسکیما کے بغیر سادہ کلید-قدر، ترتیبات کے لیے موزوں
  • Proto DataStore — protobuf اسکیما اور خودکار منتقلی کے ساتھ ٹائپ شدہ ذخیرہ
  • منتقلی SharedPreferences سے DataStore میں SharedPreferencesMigration کے ذریعے بلٹ ان
  • تھریڈ سیفٹی — تمام کارروائیاں غیر متزامن ہیں، UI مسدود کرنا ختم کر دیا گیا
  • ری ایکٹیویٹی — Flow ہر ڈیٹا تبدیلی پر سبسکرائبرز کو مطلع کرتا ہے
  • سفارش — تمام نئے Android پروجیکٹس میں DataStore استعمال کریں، ترتیبات کے ساتھ کام کرتے وقت موجودہ پروجیکٹس کو منتقل کریں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں