समस्या
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 ऑब्जर्वेशन
- माइग्रेशन सपोर्ट
- बेहतर प्रदर्शन