bir sınıf nesnesini paylaşılan tercihte depolayın ve alın


111

Android'de bir sınıfın bir nesnesini paylaşılan tercihlerde saklayabilir ve nesneyi daha sonra alabilir miyiz?

Mümkünse nasıl yapılır? Mümkün değilse, bunu yapmanın diğer olasılıkları nelerdir?

Serileştirmenin bir seçenek olduğunu biliyorum, ancak paylaşılan tercihleri ​​kullanarak olasılıklar arıyorum.


Birisinin ihtiyacı olması durumunda bir yardımcı kitaplık ekliyorum
Tsung Goh


İşte benzer soruya bir cevap .
tpk


Bir çok özelliği olan bu kütüphaneyi kullanabilirsiniz. github.com/moinkhan-in/PreferenceSpider
Moinkhan

Yanıtlar:


15

Mümkün değil.

Paylaşılan Referanslar SharePreferences'da yalnızca basit değerleri depolayabilirsiniz.

Kaydetmeniz gereken sınıfta özellikle ne var?


1
Teşekkürler.Sınıfın bazı veri üyelerini saklamak istiyorum ve paylaşılan tercihi kullanarak veri üyelerinin her bir değerini saklamak istemiyorum, bunu bir nesne olarak saklamak istiyorum.Paylaşımlı tercih değilse diğer seçeneklerim nelerdir?
androidGuy

5
Serileştirin ve bir veritabanında (SQLite) / düz bir dosyada saklayın.
Blundell

5
Cevap tam değil. Olası çözüm
pojo'yu

27
başka bir seçenek de json olarak kaydedilir ve ardından geri eşlenir. GSON veya jackSON ile gerçekten çok kolay
12'de

2
zaman makinemi 2011'e geri götürmeme ve bunu
çözmeme

324

Evet, bunu Gson kullanarak yapabiliriz

GitHub'dan Çalışma kodunu indirin

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

Kurtarmak için

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

Unutmak

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

Update1

GSON son sürümü indirilebilir github.com/google/gson .

Update2

Gradle / Android Studio kullanıyorsanız, build.gradlebağımlılıklar bölümüne aşağıdakileri girin -

implementation 'com.google.code.gson:gson:2.6.2'

benim durumumda çalışmıyor. Jar'ı kitaplıklara koyup derleme yolunu ayarladıktan sonra bile, Gson sınıfı çözülmüyor.
Shirish Herwade

Projeyi temizleyin ve ardından @ShirishHerwade'i deneyin
Parag Chauhan,

@parag da çalışmıyor. Lütfen bana yukarıdaki hatayı kaldırmak için bu kavanozu kullanma adımlarını söyleyebilir misiniz? Bu kavanozu libs klasörüne başarıyla ekledim ve ardından "java oluşturma yolu" na da masaüstüme harici olarak depolayan json eklemeye çalıştım
Shirish Herwade

7
Bu cevap, sınırlamalarından da bahsetse daha da iyi olabilirdi. Ne tür bir nesneyi bu şekilde saklayabilir ve geri alamayız? Açıkçası tüm sınıflar için işe yaramayacak.
wvdz

3
String json = gson.toJson("MyObject");bir String değil nesne olmalıdır.
Ahmed Hegazy

44

Object'imizi dahili belleğe çıkarmak için Outputstream'i kullanabiliriz. Ve dizeye dönüştürüp tercihe kaydedin. Örneğin:

    mPrefs = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor ed = mPrefs.edit();
    ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

    ObjectOutputStream objectOutput;
    try {
        objectOutput = new ObjectOutputStream(arrayOutputStream);
        objectOutput.writeObject(object);
        byte[] data = arrayOutputStream.toByteArray();
        objectOutput.close();
        arrayOutputStream.close();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
        b64.write(data);
        b64.close();
        out.close();

        ed.putString(key, new String(out.toByteArray()));

        ed.commit();
    } catch (IOException e) {
        e.printStackTrace();
    }

Preference'tan Object ayıklamamız gerektiğinde. Kodu aşağıdaki gibi kullanın

    byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
    if (bytes.length == 0) {
        return null;
    }
    ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
    Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
    ObjectInputStream in;
    in = new ObjectInputStream(base64InputStream);
    MyObject myObject = (MyObject) in.readObject();

Merhaba, bunun bir süre önce gönderildiğini biliyorum, ancak depolanan nesneyi çıkarmak için sahip olduğunuz kodun doğru olduğundan emin misiniz? Son 2 satırda, basitçe "yeni ObjectInputStream (byteArray)" yerine açık kurucuların nasıl tanımlanması gerektiği konusunda sızlanan birden çok hata alıyorum. Yardım için teşekkürler!
Wakka Wakka Wakka

Merhaba, aniden in = new ObjectInputStream (base64InputStream) üzerinde bir EOFException alıyorum; Bunu sizin yaptığınız gibi paylaşılan tercihlere yazıyorum. Sence ne yanlış olabilir?
marienke

Tercih etmek için Object yazarken herhangi bir istisna var mı? SDK'dan: Bir program giriş işlemi sırasında bir dosyanın veya akışın sonuyla karşılaştığında EOFException atılır.
Kislingk

Tebrikler, bu sorun için şimdiye kadar karşılaştığım en iyi çözüm bu. Bağımlılık yok. Bununla birlikte, bir nesne için ObjectOutput / InputStream'i kullanabilmek için, söz konusu nesnenin ve içindeki tüm özel nesnelerin Serializable arayüzü uygulaması gerektiğine dikkat edilmelidir.
user1112789

8

Ben de aynı sorunu yaşadım, işte çözümüm:

Paylaşılan Tercihler'e kaydetmek istediğim Sınıfım ve ArrayList <Sınıfım> var. İlk önce MyClass'a, onu JSON nesnesine dönüştüren bir yöntem ekledim:

public JSONObject getJSONObject() {
    JSONObject obj = new JSONObject();
    try {
        obj.put("id", this.id);
        obj.put("name", this.name);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return obj;
}

Ardından, "ArrayList <MyClass> items" nesnesini kaydetme yöntemi:

SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
    SharedPreferences.Editor editor = mPrefs.edit();

    Set<String> set= new HashSet<String>();
    for (int i = 0; i < items.size(); i++) {
        set.add(items.get(i).getJSONObject().toString());
    }

    editor.putStringSet("some_name", set);
    editor.commit();

Ve işte nesneyi geri getirme yöntemi:

public static ArrayList<MyClass> loadFromStorage() {
    SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);

    ArrayList<MyClass> items = new ArrayList<MyClass>();

    Set<String> set = mPrefs.getStringSet("some_name", null);
    if (set != null) {
        for (String s : set) {
            try {
                JSONObject jsonObject = new JSONObject(s);
                Long id = jsonObject.getLong("id"));
                String name = jsonObject.getString("name");
                MyClass myclass = new MyClass(id, name);

                items.add(myclass);

            } catch (JSONException e) {
                e.printStackTrace();
         }
    }
    return items;
}

Paylaşılan Tercihlerde StringSet'in API 11'den beri mevcut olduğunu unutmayın.


Sorunumu çözdüm. Bir şey eklemek istiyorum. İlk kullanım için setin boş olup olmadığını kontrol etmeliyiz. eğer (set! = null) {for (String s: set) {..}}
xevser

@xevser Önerildiği gibi boş onay ekledim. Teşekkürler.
Micer

6

Gson Kitaplığını Kullanma:

dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}

Mağaza:

Gson gson = new Gson();
//Your json response object value store in json object
JSONObject jsonObject = response.getJSONObject();
//Convert json object to string
String json = gson.toJson(jsonObject);
//Store in the sharedpreference
getPrefs().setUserJson(json);

Al:

String json = getPrefs().getUserJson();

Parsel, genel amaçlı bir serileştirme mekanizması değildir. Bu sınıf (ve rastgele nesneleri bir Parsele yerleştirmek için karşılık gelen Parcelable API), yüksek performanslı bir IPC aktarımı olarak tasarlanmıştır. Bu nedenle, herhangi bir Parsel verisini kalıcı depolamaya yerleştirmek uygun değildir: Parsel'deki herhangi bir verinin temelindeki uygulamadaki değişiklikler eski verileri okunamaz hale getirebilir.
Marcos Vasconcelos

1

PowerPreferenceKitaplığı kullanarak 3 kolay adımda yapabilirsiniz!

https://github.com/AliAsadi/PowerPreference

1. Nesne Oluşturun

Object obj = new Object();

2. Paylaşılan tercihe yazın

PowerPreference.getDefaultFile().put("object",obj);

3. Nesneyi elde etmek

Object obj = PowerPreference.getDefaultFile()
                            .getObject("object", Object.class);


0

Karmaşık Tercihler Android'i kullanabilirsiniz - Felipe Silvestre tarafından özel nesneleri saklamak için kütüphaneye. Temel olarak, nesneleri depolamak için GSON mekanizmasını kullanıyor.

Nesneyi tercihlere kaydetmek için:

User user = new User();
user.setName("Felipe");
user.setAge(22); 
user.setActive(true); 

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(
     this, "mypref", MODE_PRIVATE);
complexPreferences.putObject("user", user);
complexPreferences.commit();

Ve geri almak için:

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE);
User user = complexPreferences.getObject("user", User.class);

Parsel, genel amaçlı bir serileştirme mekanizması değildir. Bu sınıf (ve rastgele nesneleri bir Parsele yerleştirmek için karşılık gelen Parcelable API), yüksek performanslı bir IPC aktarımı olarak tasarlanmıştır. Bu nedenle, herhangi bir Parsel verisini kalıcı depolamaya yerleştirmek uygun değildir: Parsel'deki herhangi bir verinin temelindeki uygulamadaki değişiklikler eski verileri okunamaz hale getirebilir.
Marcos Vasconcelos

Bu kullanımdan kaldırıldı
IgorGanapolsky

0

Gradle Build.gradle'ı kullanarak GSON'u kullanabilirsiniz:

implementation 'com.google.code.gson:gson:2.8.0'

Sonra kodunuzda, örneğin Kotlin ile dizgi / boole çiftleri:

        val nestedData = HashMap<String,Boolean>()
        for (i in 0..29) {
            nestedData.put(i.toString(), true)
        }
        val gson = Gson()
        val jsonFromMap = gson.toJson(nestedData)

SharedPrefs'e Ekleniyor:

        val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()
        sharedPrefEditor.putString("sig_types", jsonFromMap)
        sharedPrefEditor.apply()

Şimdi verileri almak için:

val gson = Gson()
val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)
val json = sharedPref.getString("sig_types", "false")
val type = object : TypeToken<Map<String, Boolean>>() {}.type
val map = gson.fromJson(json, type) as LinkedTreeMap<String,Boolean>
for (key in map.keys) {
     Log.i("myvalues", key.toString() + map.get(key).toString())
}

Parsel, genel amaçlı bir serileştirme mekanizması değildir. Bu sınıf (ve rastgele nesneleri bir Parsele yerleştirmek için karşılık gelen Parcelable API), yüksek performanslı bir IPC aktarımı olarak tasarlanmıştır. Bu nedenle, herhangi bir Parsel verisini kalıcı depolamaya yerleştirmek uygun değildir: Parsel'deki herhangi bir verinin temelindeki uygulamadaki değişiklikler eski verileri okunamaz hale getirebilir.
Marcos Vasconcelos

0

Ortak paylaşılan tercih (CURD) SharedPreference: Verileri, basit bir Kotlin sınıfıyla değer-anahtar çiftleri biçiminde depolamak.

var sp = SharedPreference(this);

Veri depolama:

String, Int ve Boolean verilerini depolamak için aynı ada ve farklı parametrelere sahip üç yöntemimiz var (Yöntem aşırı yükleme).

save("key-name1","string value")
save("key-name2",int value)
save("key-name3",boolean)

Verileri Al: SharedPreferences'da depolanan verileri almak için aşağıdaki yöntemleri kullanın.

sp.getValueString("user_name")
sp.getValueInt("user_id")
sp.getValueBoolean("user_session",true)

Tüm Verileri Temizle: Tüm Paylaşılan Tercihleri ​​temizlemek için aşağıdaki kodu kullanın.

 sp.clearSharedPreference()

Belirli Verileri Kaldır:

sp.removeValue("user_name")

Ortak Paylaşılan Tercih Sınıfı

import android.content.Context
import android.content.SharedPreferences

class SharedPreference(private val context: Context) {
    private val PREFS_NAME = "coredata"
    private val sharedPref: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
    //********************************************************************************************** save all
    //To Store String data
    fun save(KEY_NAME: String, text: String) {

        val editor: SharedPreferences.Editor = sharedPref.edit()
        editor.putString(KEY_NAME, text)
        editor.apply()
    }
    //..............................................................................................
    //To Store Int data
    fun save(KEY_NAME: String, value: Int) {

        val editor: SharedPreferences.Editor = sharedPref.edit()
        editor.putInt(KEY_NAME, value)
        editor.apply()
    }
    //..............................................................................................
    //To Store Boolean data
    fun save(KEY_NAME: String, status: Boolean) {

        val editor: SharedPreferences.Editor = sharedPref.edit()
        editor.putBoolean(KEY_NAME, status)
        editor.apply()
    }
    //********************************************************************************************** retrieve selected
    //To Retrieve String
    fun getValueString(KEY_NAME: String): String? {

        return sharedPref.getString(KEY_NAME, "")
    }
    //..............................................................................................
    //To Retrieve Int
    fun getValueInt(KEY_NAME: String): Int {

        return sharedPref.getInt(KEY_NAME, 0)
    }
    //..............................................................................................
    // To Retrieve Boolean
    fun getValueBoolean(KEY_NAME: String, defaultValue: Boolean): Boolean {

        return sharedPref.getBoolean(KEY_NAME, defaultValue)
    }
    //********************************************************************************************** delete all
    // To clear all data
    fun clearSharedPreference() {

        val editor: SharedPreferences.Editor = sharedPref.edit()
        editor.clear()
        editor.apply()
    }
    //********************************************************************************************** delete selected
    // To remove a specific data
    fun removeValue(KEY_NAME: String) {
        val editor: SharedPreferences.Editor = sharedPref.edit()
        editor.remove(KEY_NAME)
        editor.apply()
    }
}

Blog: https://androidkeynotes.blogspot.com/2020/02/shared-preference.html


-2

Paylaşılan Tercihlerde nesne depolamanın bir yolu yok, yaptığım şey bir genel sınıf oluşturmak, ihtiyacım olan tüm parametreleri koymak ve ayarlayıcılar ve alıcılar oluşturmaktı, nesnelerime erişebildim,


-3

Uygulama donw'yi kapattıktan sonra veya sadece çalışırken nesneyi geri almanız mı gerekiyor?

Bunu bir veritabanında saklayabilirsiniz.
Veya özel bir Uygulama sınıfı oluşturun.

public class MyApplication extends Application {

    private static Object mMyObject;
    // static getter & setter
    ...
}

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:name=".MyApplication">
        <activity ... />
        ...
    </application>
    ...
</manifest>

Ve sonra her aktiviteden şunları yapın:

((MyApplication) getApplication).getMyObject();

Gerçekten en iyi yol değil ama işe yarıyor.


-6

Evet, nesneyi Sharedpreference'ı kullanarak depolayabilir ve geri alabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.