Tôi có một ArrayList
trong số các đối tượng có tên và con trỏ biểu tượng và tôi muốn lưu nó vào SharedPreferences
. Làm thế nào tôi có thể làm được?
LƯU Ý: Tôi không muốn sử dụng Cơ sở dữ liệu
Câu trả lời:
Vì vậy, từ trang web dành cho nhà phát triển Android trên Data Storage :
Sở thích của người sử dụng
Tùy chọn chia sẻ không hoàn toàn để lưu "tùy chọn người dùng", chẳng hạn như nhạc chuông mà người dùng đã chọn. Nếu bạn quan tâm đến việc tạo tùy chọn người dùng cho ứng dụng của mình, hãy xem PreferenceActivity, cung cấp khung Hoạt động để bạn tạo tùy chọn người dùng, tùy chọn này sẽ tự động tồn tại (sử dụng tùy chọn được chia sẻ).
Vì vậy, tôi nghĩ rằng nó không sao vì nó chỉ đơn giản là các cặp khóa-giá trị được duy trì.
Đối với người đăng ban đầu, điều này không khó lắm. Bạn chỉ cần lặp lại danh sách mảng của mình và thêm các mục. Trong ví dụ này, tôi sử dụng bản đồ để đơn giản hóa nhưng bạn có thể sử dụng danh sách mảng và thay đổi nó một cách thích hợp:
// my list of names, icon locations
Map<String, String> nameIcons = new HashMap<String, String>();
nameIcons.put("Noel", "/location/to/noel/icon.png");
nameIcons.put("Bob", "another/location/to/bob/icon.png");
nameIcons.put("another name", "last/location/icon.png");
SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
for (String s : nameIcons.keySet()) {
// use the name as the key, and the icon as the value
keyValuesEditor.putString(s, nameIcons.get(s));
}
keyValuesEditor.commit()
Bạn sẽ làm điều gì đó tương tự để đọc lại các cặp khóa-giá trị. Hãy cho tôi biết nếu các công trình này.
Cập nhật: Nếu bạn đang sử dụng API cấp 11 trở lên, có một phương pháp để ghi ra Tập hợp chuỗi
Bất kể cấp API là gì, hãy kiểm tra mảng chuỗi và mảng đối tượng trong SharedPreferences
LƯU ĐẾN
public boolean saveArray(String[] array, String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(arrayName +"_size", array.length);
for(int i=0;i<array.length;i++)
editor.putString(arrayName + "_" + i, array[i]);
return editor.commit();
}
TẢI ĐẾN
public String[] loadArray(String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
int size = prefs.getInt(arrayName + "_size", 0);
String array[] = new String[size];
for(int i=0;i<size;i++)
array[i] = prefs.getString(arrayName + "_" + i, null);
return array;
}
Viết,
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this);
JSONArray jsonArray = new JSONArray();
jsonArray.put(1);
jsonArray.put(2);
Editor editor = prefs.edit();
editor.putString("key", jsonArray.toString());
System.out.println(jsonArray.toString());
editor.commit();
Đọc,
try {
JSONArray jsonArray2 = new JSONArray(prefs.getString("key", "[]"));
for (int i = 0; i < jsonArray2.length(); i++) {
Log.d("your JSON Array", jsonArray2.getInt(i)+"");
}
} catch (Exception e) {
e.printStackTrace();
}
Tùy chọn chia sẻ đã giới thiệu a getStringSet
và putStringSet
các phương thức trong API Cấp 11, nhưng điều đó không tương thích với các phiên bản Android cũ hơn (vẫn còn phổ biến) và cũng bị giới hạn ở các nhóm chuỗi.
Android không cung cấp các phương pháp tốt hơn và việc lặp lại các bản đồ và mảng để lưu và tải chúng không dễ dàng và sạch sẽ, đặc biệt là đối với mảng. Nhưng triển khai tốt hơn không quá khó:
package com.example.utils;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.SharedPreferences;
public class JSONSharedPreferences {
private static final String PREFIX = "json";
public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(JSONSharedPreferences.PREFIX+key, object.toString());
editor.commit();
}
public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(JSONSharedPreferences.PREFIX+key, array.toString());
editor.commit();
}
public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}"));
}
public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]"));
}
public static void remove(Context c, String prefName, String key) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
if (settings.contains(JSONSharedPreferences.PREFIX+key)) {
SharedPreferences.Editor editor = settings.edit();
editor.remove(JSONSharedPreferences.PREFIX+key);
editor.commit();
}
}
}
Giờ đây, bạn có thể lưu bất kỳ bộ sưu tập nào trong tùy chọn chia sẻ bằng năm phương pháp này. Làm việc với JSONObject
và JSONArray
rất dễ dàng. Bạn có thể sử dụng hàm tạo JSONArray (Collection copyFrom)
công khai để tạo JSONArray
ra từ bất kỳ bộ sưu tập Java nào và sử dụng JSONArray
các get
phương thức của để truy cập các phần tử.
Không có giới hạn kích thước cho các tùy chọn chia sẻ (ngoài giới hạn bộ nhớ của thiết bị), vì vậy các phương pháp này có thể hoạt động trong hầu hết các trường hợp thông thường khi bạn muốn lưu trữ nhanh chóng và dễ dàng cho một số bộ sưu tập trong ứng dụng của mình. Nhưng phân tích cú pháp JSON xảy ra ở đây và các tùy chọn trong Android được lưu trữ dưới dạng XML trong nội bộ, vì vậy tôi khuyên bạn nên sử dụng các cơ chế lưu trữ dữ liệu liên tục khác khi bạn đang xử lý megabyte dữ liệu.
Chế độ dễ dàng để lưu trữ đối tượng phức tạp với việc sử dụng thư viện Gson google [1]
public static void setComplexObject(Context ctx, ComplexObject obj){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("COMPLEX_OBJECT",new Gson().toJson(obj));
editor.commit();
}
public static ComplexObject getComplexObject (Context ctx){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
String sobj = preferences.getString("COMPLEX_OBJECT", "");
if(sobj.equals(""))return null;
else return new Gson().fromJson(sobj, ComplexObject.class);
}
Tôi đã tải một loạt các kích thước vòng eo (đã được tạo trong array.xml của tôi) vào tệp tùy chọn.xml với mã bên dưới. @ array / pant_inch_size là id của toàn bộ mảng.
<ListPreference
android:title="choosepantsize"
android:summary="Choose Pant Size"
android:key="pantSizePref"
android:defaultValue="34"
android:entries="@array/pant_inch_size"
android:entryValues="@array/pant_inch_size" />
Điều này điền vào menu với các lựa chọn từ mảng. Tôi đặt kích thước mặc định là 34, vì vậy khi menu bật lên, họ thấy kích thước 34 đã được chọn trước.
Cách đơn giản là chuyển nó thành Chuỗi JSON như ví dụ dưới đây:
Gson gson = new Gson();
String json = gson.toJson(myObj);
Sau đó, lưu trữ chuỗi trong tùy chọn được chia sẻ. Khi bạn cần nó, chỉ cần lấy chuỗi từ các tùy chọn được chia sẻ và chuyển đổi trở lại JSONArray hoặc JSONObject (theo yêu cầu của bạn.)
Để viết:
private <T> void storeData(String key, T data) {
ByteArrayOutputStream serializedData = new ByteArrayOutputStream();
try {
ObjectOutputStream serializer = new ObjectOutputStream(serializedData);
serializer.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putString(key, Base64.encodeToString(serializedData.toByteArray(), Base64.DEFAULT));
edit.commit();
}
Để đọc:
private <T> T getStoredData(String key) {
SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
String serializedData = sharedPreferences.getString(key, null);
T storedData = null;
try {
ByteArrayInputStream input = new ByteArrayInputStream(Base64.decode(serializedData, Base64.DEFAULT));
ObjectInputStream inputStream = new ObjectInputStream(input);
storedData = (T)inputStream.readObject();
} catch (IOException|ClassNotFoundException|java.lang.IllegalArgumentException e) {
e.printStackTrace();
}
return storedData;
}
Đây là mã ưu đãi được chia sẻ mà tôi sử dụng thành công, Tham khảo liên kết này :
public class MainActivity extends Activity {
private static final int RESULT_SETTINGS = 1;
Button button;
public String a="dd";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = (Button) findViewById(R.id.btnoptions);
setContentView(R.layout.activity_main);
// showUserSettings();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
Intent i = new Intent(this, UserSettingActivity.class);
startActivityForResult(i, RESULT_SETTINGS);
break;
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_SETTINGS:
showUserSettings();
break;
}
}
private void showUserSettings() {
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this);
StringBuilder builder = new StringBuilder();
builder.append("\n Pet: "
+ sharedPrefs.getString("prefpetname", "NULL"));
builder.append("\n Address:"
+ sharedPrefs.getString("prefaddress","NULL" ));
builder.append("\n Your name: "
+ sharedPrefs.getString("prefname", "NULL"));
TextView settingsTextView = (TextView) findViewById(R.id.textUserSettings);
settingsTextView.setText(builder.toString());
}
}
GIẢI MÃ VUI VẺ!
Bạn có thể sử dụng putStringSet
Điều này cho phép bạn lưu HashSet theo sở thích của mình, giống như sau:
Tiết kiệm
Set<String> values;
SharedPreferences sharedPref =
mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);
Editor editor = sharedPref.edit();
editor.putStringSet("YOUR_KEY", values);
editor.apply();
Retrive
SharedPreferences sharedPref =
mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);
Editor editor = sharedPref.edit();
Set<String> newList = editor.getStringSet("YOUR_KEY", null);
PutStringSet chỉ cho phép một Set và đây là một danh sách không có thứ tự .
Khi tôi bị lỗi này, tôi đã nhận được giải pháp tuần tự hóa ở đó, bạn có thể tuần tự hóa chuỗi của mình, Nhưng tôi cũng nghĩ ra một cách hack.
Chỉ đọc phần này nếu bạn chưa đọc về việc đăng nhiều kỳ, nếu không hãy đi xuống và đọc bản hack của tôi
Để lưu trữ các mục mảng theo thứ tự, chúng ta có thể tuần tự hóa mảng thành một chuỗi duy nhất (bằng cách tạo một lớp mới ObjectSerializer (sao chép mã từ - www.androiddevcourse.com/objectserializer.html, thay thế mọi thứ ngoại trừ tên gói))
Nhập dữ liệu trong Tùy chọn chia sẻ:
phần còn lại của mã trên dòng 38 -
Đặt đối số tiếp theo như thế này, để nếu dữ liệu không được truy xuất, nó sẽ trả về mảng trống (chúng tôi không thể đặt chuỗi trống vì vùng chứa / biến là một mảng không phải là chuỗi)
Đến với Hack của tôi: -
Hợp nhất nội dung của mảng thành một chuỗi duy nhất bằng cách có một số ký hiệu ở giữa mỗi mục và sau đó chia nó bằng cách sử dụng ký hiệu đó khi truy xuất nó. Coz thêm và truy xuất Chuỗi dễ dàng với các tùy chọn được chia sẻ. Nếu bạn lo lắng về việc chia nhỏ chỉ cần tra cứu "tách một chuỗi trong java".
[Lưu ý: Điều này hoạt động tốt nếu nội dung của mảng của bạn thuộc loại nguyên thủy như string, int, float, v.v. Nó sẽ hoạt động đối với các mảng phức tạp có cấu trúc riêng của nó, giả sử là danh bạ điện thoại, nhưng việc hợp nhất và tách sẽ trở thành hơi phức tạp. ]
PS: Mình mới sử dụng android nên không biết có phải bản hack hay không, mong các bạn tìm bản hack hay hơn.