Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Android में ArrayList को SharedPreferences में सेव करना

समस्या

SharedPreferences केवल प्रिमिटिव टाइप्स (String, int, boolean, float, long, Set<String>) सपोर्ट करता है। ArrayList या कस्टम ऑब्जेक्ट्स सीधे सेव नहीं किए जा सकते। समाधान: Gson का उपयोग करके ArrayList को JSON स्ट्रिंग में बदलें।

निर्भरता जोड़ें

// build.gradle (Module: app)
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

पूर्ण कार्यान्वयन

1. डेटा मॉडल (वैकल्पिक - String लिस्ट के लिए)

// अगर कस्टम ऑब्जेक्ट्स सेव कर रहे हैं
public class User {
    private String name;
    private String email;
    private int age;
    // गेटर्स/सेटर्स...
}

2. SharedPreferences हेल्पर क्लास

import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class PrefsManager {
    private static final String PREFS_NAME = "app_prefs";
    private static final String KEY_USER_LIST = "user_list";
    private static final String KEY_STRING_LIST = "string_list";

    private final SharedPreferences prefs;
    private final Gson gson;

    public PrefsManager(Context context) {
        prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        gson = new Gson();
    }

    // ===== String ArrayList =====
    public void saveStringList(List list) {
        String json = gson.toJson(list);
        prefs.edit().putString(KEY_STRING_LIST, json).apply();
    }

    public List getStringList() {
        String json = prefs.getString(KEY_STRING_LIST, null);
        if (json == null) return new ArrayList<>();
        
        Type type = new TypeToken>() {}.getType();
        return gson.fromJson(json, type);
    }

    // ===== कस्टम ऑब्जेक्ट ArrayList =====
    public void saveUserList(List users) {
        String json = gson.toJson(users);
        prefs.edit().putString(KEY_USER_LIST, json).apply();
    }

    public List getUserList() {
        String json = prefs.getString(KEY_USER_LIST, null);
        if (json == null) return new ArrayList<>();
        
        Type type = new TypeToken>() {}.getType();
        return gson.fromJson(json, type);
    }

    // ===== यूटिलिटी =====
    public void clearAll() {
        prefs.edit().clear().apply();
    }

    public boolean hasData() {
        return prefs.contains(KEY_STRING_LIST) || prefs.contains(KEY_USER_LIST);
    }
}

3. MainActivity में उपयोग

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private PrefsManager prefsManager;
    private List stringList = new ArrayList<>();
    private ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        prefsManager = new PrefsManager(this);

        EditText inputEditText = findViewById(R.id.inputEditText);
        Button saveBtn = findViewById(R.id.saveBtn);
        Button loadBtn = findViewById(R.id.loadBtn);
        ListView listView = findViewById(R.id.listView);

        // एडाप्टर सेटअप
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stringList);
        listView.setAdapter(adapter);

        // सेव बटन
        saveBtn.setOnClickListener(v -> {
            String text = inputEditText.getText().toString().trim();
            if (text.isEmpty()) {
                Toast.makeText(this, "कुछ दर्ज करें", Toast.LENGTH_SHORT).show();
                return;
            }
            stringList.add(text);
            prefsManager.saveStringList(stringList);
            adapter.notifyDataSetChanged();
            inputEditText.setText("");
            Toast.makeText(this, "सेव किया गया: " + text, Toast.LENGTH_SHORT).show();
        });

        // लोड बटन
        loadBtn.setOnClickListener(v -> {
            List loaded = prefsManager.getStringList();
            stringList.clear();
            stringList.addAll(loaded);
            adapter.notifyDataSetChanged();
            Toast.makeText(this, loaded.size() + " आइटम लोड हुए", Toast.LENGTH_SHORT).show();
        });

        // ऐप स्टार्ट पर ऑटो-लोड
        stringList.addAll(prefsManager.getStringList());
        adapter.notifyDataSetChanged();
    }
}

4. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/inputEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="टेक्स्ट दर्ज करें" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/saveBtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="सेव करें" />

        <Button
            android:id="@+id/loadBtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginStart="8dp"
            android:text="लोड करें" />

    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_marginTop="16dp" />

</LinearLayout>

महत्वपूर्ण नोट्स

  • apply() vs commit(): apply() एसिंक्रोनस है (पसंदीदा), commit() सिंक्रोनस है और बूलियन रिटर्न करता है
  • TypeToken: जेनेरिक टाइप इरेज़र के कारण new TypeToken>(){}.getType() आवश्यक है
  • आकार सीमा: SharedPreferences छोटे डेटा के लिए है (< 1MB)। बड़े डेटा के लिए Room/SQLite उपयोग करें
  • थ्रेड सुरक्षा: SharedPreferences थ्रेड-सेफ है लेकिन Gson पार्सिंग मेन थ्रेड पर न करें बड़ी लिस्ट्स के लिए

विकल्प: Room Database

जटिल/बड़े डेटासेट के लिए, Room Database बेहतर विकल्प है:

  • SQL क्वेरी सपोर्ट
  • LiveData/Flow ऑब्जर्वेशन
  • माइग्रेशन सपोर्ट
  • बेहतर प्रदर्शन
  1. एंड्रॉइड ऐप के SharedPreferences डेटा कैसे डिलीट करें एंड्रॉइड ऐप के SharedPreferences डेटा कैसे डिलीट करें

    SharedPreferences से विशिष्ट कुंजियाँ या पूरा डेटा हटाने के तरीके एंड्रॉइड में SharedPreferences डेटा हटाने के कई तरीके हैं: विशिष्ट कुंजी हटाना, सभी डेटा साफ करना, या डिफ़ॉल्ट वैल्यूज पर रीसेट करना। यह उदाहरण सभी विधियों को दर्शाता है। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में प्रोजेक्ट बनाएं।

  1. Android पर Gmail अटैचमेंट कैसे सेव करें Android पर Gmail अटैचमेंट कैसे सेव करें

    पिछले साल Android ऐप के एक बड़े अपडेट के बाद से Android पर अपने फोन पर Gmail अटैचमेंट सेव करना बहुत आसान हो गया है। अब आपको उस ईमेल थ्रेड में भी होने की आवश्यकता नहीं है जिसमें अटैचमेंट है ताकि आप इसे अपने फोन पर डाउनलोड कर सकें! यहां हम Android पर Gmail अटैचमेंट सेव करने के कुछ तरीके दिखाने जा रहे

  1. एंड्रॉइड पर ट्विटर GIF सेव करें: त्वरित और आसान गाइड एंड्रॉइड पर ट्विटर GIF सेव करें: त्वरित और आसान गाइड

    ट्विटर सोशल मीडिया की मात्र परिभाषा से आगे निकल गया है क्योंकि इसका उपयोग दुनिया की घटनाओं से अवगत कराने के अलावा और भी बहुत कुछ के लिए किया जा रहा है। संगठन, सेलिब्रिटी, राजनीतिक हस्तियां और छात्र, हर कोई अपने विचारों को व्यक्त करने और बढ़ावा देने के लिए इस प्लेटफॉर्म का उपयोग करता है। इस माइक्रो-ब