سؤال

انا لدي ArrayList من الكائنات التي لها اسم ومؤشر أيقونة وأريد حفظه في SharedPreferences. كيف استطيع ان افعل؟

ملاحظة: لا أريد استخدام قاعدة البيانات

هل كانت مفيدة؟

المحلول

لذلك من موقع مطور Android على مخزن البيانات:

خيارات المستخدم

تفضيلات المشتركة ليست بدقة من أجل حفظ "تفضيلات المستخدم" ، " مثل النغمة التي اختارها المستخدم. إذا كنت مهتمًا بإنشاء تفضيلات المستخدم لتطبيقك ، راجع تفضيلات ، والذي يوفر إطار عمل لك لإنشاء تفضيلات المستخدم ، والتي سيتم استمرارها تلقائيًا (باستخدام التفضيلات المشتركة).

لذلك أعتقد أنه على ما يرام لأنه ببساطة مجرد أزواج قيمة رئيسية مستمرة.

إلى الملصق الأصلي ، هذا ليس بهذه الصعوبة. يمكنك ببساطة التكرار من خلال قائمة المصفوفة الخاصة بك وإضافة العناصر. في هذا المثال ، أستخدم خريطة للبساطة ولكن يمكنك استخدام قائمة صفيف وتغييرها بشكل مناسب:

// 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()

ستفعل شيئًا مشابهًا لقراءة أزواج القيمة الرئيسية مرة أخرى. دعني اعرف اذا هذه تعمل.

تحديث: إذا كنت تستخدم مستوى API 11 أو أحدث ، فهناك ملف طريقة لكتابة مجموعة سلسلة

نصائح أخرى

بغض النظر عن مستوى API ، تحقق صفائف السلسلة ومصفوفات الكائنات في المشاركين


حفظ الصفيف

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();  
} 

صفيف تحميل

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;  
}  

لأكتب،

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();

ليقرأ،

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();
}

قدمت التفضيلات المشتركة أ getStringSet و putStringSet الأساليب في مستوى API 11 ، ولكن هذا غير متوافق مع الإصدارات القديمة من Android (والتي لا تزال شائعة) ، كما أنها تقتصر على مجموعات من الأوتار.

لا يوفر Android طرقًا أفضل ، ولا يعد الحلقات على الخرائط والصفائف لتوفيرها وتحميلها سهلة للغاية ونظيفة ، خاصة للمصفوفات. لكن التنفيذ الأفضل ليس بالأمر الصعب:

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();
        }
    }
}

يمكنك الآن حفظ أي مجموعة في تفضيلات مشتركة مع هذه الطرق الخمس. أعمل مع JSONObject و JSONArray سهل جدا. يمكنك استخدام JSONArray (Collection copyFrom) مُنشئ عام لجعل ملف JSONArray من أي مجموعة من Java واستخدامها JSONArrayget طرق للوصول إلى العناصر.

لا يوجد حد للحجم للتفضيلات المشتركة (إلى جانب حدود تخزين الجهاز) ، بحيث يمكن أن تعمل هذه الطرق في معظم الحالات المعتادة حيث تريد تخزينًا سريعًا وسهلاً لبعض المجموعات في تطبيقك. ولكن يحدث تحليل JSON هنا ، ويتم تخزين التفضيلات في Android كـ XMLs داخليًا ، لذلك أوصي باستخدام آليات تخزين البيانات المستمرة الأخرى عند التعامل مع ميغابايت من البيانات.

وضع سهل لتخزين الكائنات المعقدة باستخدام مكتبة 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);
}

[1] http://code.google.com/p/google-gson/

لقد قمت بتحميل مجموعة من أحجام الخصر (تم إنشاؤها بالفعل في Array.xml) في ملف templences.xml الخاص بي مع الكود أدناه. @array/pant_inch_size هو معرف الصفيف بأكمله.

 <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" /> 

هذا ملولد القائمة مع خيارات من المصفوفة. لقد قمت بتعيين الحجم الافتراضي على أنه 34 ، لذلك عندما تنبثق القائمة ، فإن الحجم 34 يتم اختياره مسبقًا.

الطريقة البسيطة هي تحويلها إلى سلسلة JSON على النحو التالي:

Gson gson = new Gson();
String json = gson.toJson(myObj);

ثم قم بتخزين السلسلة في التفضيلات المشتركة. بمجرد أن تحتاجها فقط الحصول على سلسلة من التفضيلات المشتركة والاستعادة إلى Jsonarray أو JsonObject (حسب متطلباتك.)

للكتابة:

 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();
}

للقراءة:

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;
}

هذا هو رمز التفضيلات المشتركة التي أستخدمها بنجاح ، راجع هذا حلقة الوصل:

  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());


    }

   }

ترميز سعيد!

يمكنك استخدام putstringset

هذا يسمح لك بحفظ مجموعة التجزئة في تفضيلاتك ، تمامًا مثل هذا:

يحفظ

Set<String> values;

SharedPreferences sharedPref = 
    mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);

Editor editor = sharedPref.edit();

editor.putStringSet("YOUR_KEY", values);
editor.apply();

إعادة

SharedPreferences sharedPref = 
    mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);

Editor editor = sharedPref.edit();

Set<String> newList = editor.getStringSet("YOUR_KEY", null);

يسمح PutStringset بمجموعة فقط وهذا هو غير مرتبة قائمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top