ভাগ করা পছন্দসই করে একটি শ্রেণীর অবজেক্ট সঞ্চয় এবং পুনরুদ্ধার করুন


111

অ্যান্ড্রয়েডে আমরা কোনও শ্রেণীর কোনও বস্তুকে ভাগ করে নেওয়া পছন্দগুলিতে সঞ্চয় করতে পারি এবং পরে বস্তুটি পুনরুদ্ধার করতে পারি?

সম্ভব হলে কীভাবে করব? এটি সম্ভব না হলে এটি করার অন্যান্য সম্ভাবনাগুলি কী?

আমি জানি যে সিরিয়ালাইজেশন একটি বিকল্প, তবে আমি ভাগ করা পছন্দ ব্যবহার করে সম্ভাবনার সন্ধান করছি।



এখানে একটি উদাহরণ রয়েছে thegeekyland.blogspot.com/2015/11/…
আর্লিন্ড

অনুরূপ প্রশ্নের উত্তর এখানে ।
tpk


আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন যার মধ্যে অনেকগুলি ফাইটার রয়েছে bu github.com/moinkhan-in/PreferencesSpider
মইখান খান

উত্তর:


15

সম্ভব না.

আপনি কেবল শেয়ারডপ্রেফেন্স শেয়ারপ্রেফারেন্স.এডিটরে সাধারণ মান সংরক্ষণ করতে পারেন

ক্লাস সম্পর্কে আপনার কী সংরক্ষণ করার দরকার আছে?


1
ধন্যবাদ। আমি ক্লাসের কিছু ডেটা মেম্বার সঞ্চয় করতে চাই। এবং আমি শেয়ার করা পছন্দ ব্যবহার করে ডেটা সদস্যের প্রতিটি মান সংরক্ষণ করতে চাই না। আমি এটিকে একটি বস্তু হিসাবে সংরক্ষণ করতে চাই। যদি ভাগ না করা হয় তবে আমার অন্যান্য বিকল্পগুলি কী?
অ্যান্ড্রয়েডগুই

5
এটি সিরিয়াল করুন এবং এটি একটি ডাটাবেসে (এসকিউলাইট) / ফ্ল্যাট ফাইলে সংরক্ষণ করুন।
ব্লুন্ডেল

5
উত্তরটি সম্পূর্ণ নয়। সম্ভাব্য সমাধান pojo SharedPreferences মধ্যে স্ট্রিং যেমন ByteArrayOutPutStream মধ্যে এবং সংরক্ষণ রুপান্তর হয়
rallat

27
অন্য বিকল্প এটি জসন হিসাবে সংরক্ষণ করা হয়েছে এবং তারপরে এটি আবার মানচিত্র করুন। জিএসওএন বা জ্যাকসন সহ সত্যিই সহজ
রালাত

2
আমাকে আমার টাইম মেশিনটি ২০১১ এ ফিরে আসুন এবং এটি বের করতে দিন
ব্লুন্ডেল

324

হ্যাঁ আমরা গসন ব্যবহার করে এটি করতে পারি

গিটহাব থেকে ওয়ার্কিং কোড ডাউনলোড করুন

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

সংরক্ষণের জন্য

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

পাওয়ার জন্য

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

Update1

GSON- র সর্বশেষ সংস্করণটি github.com/google/gson থেকে ডাউনলোড করা যায়

Update2

আপনি যদি গ্র্যাডল / অ্যান্ড্রয়েড স্টুডিও ব্যবহার করছেন তবে build.gradleনির্ভরতা বিভাগে কেবল নিম্নলিখিতটি রেখেছেন -

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

আমার ক্ষেত্রে কাজ করছি না। এমনকি পাত্রে জার রাখার পরেও নির্মানের পথে স্থাপন করার পরেও, জিএসন ক্লাসটি সমাধান হচ্ছে না।
শিরিশ হার্ভাডে

ক্লিন প্রজেক্টটি তারপরে @ শিরিশ হেরওয়াদে চেষ্টা করুন
পরাগ চৌহান

@parag যে কাজ করছে না। আপনি কি দয়া করে উপরের ত্রুটিটি সরাতে সেই জারটি ব্যবহার করার পদক্ষেপগুলি আমাকে বলতে পারেন? কারণ আমি সেই
জারটিকে সফলভাবে লিবস

7
এই উত্তরটি এর সীমাবদ্ধতার কথাও উল্লেখ করলে আরও ভাল হতে পারে। কোন ধরণের অবজেক্ট আমরা রাখতে পারি এবং এই পদ্ধতিতে পুনরুদ্ধার করতে পারি না? স্পষ্টতই এটি সমস্ত শ্রেণীর জন্য কাজ করবে না।
wvdz

3
String json = gson.toJson("MyObject");স্ট্রিং নয় বস্তু হওয়া উচিত।
আহমেদ হেগজি

44

আমরা আউটপুটস্ট্রিমটি আমাদের অবজেক্টটিকে অভ্যন্তরীণ মেমরির আউটপুট দিতে পারি। এবং স্ট্রিংয়ে রূপান্তর করুন তারপরে অগ্রাধিকারে সংরক্ষণ করুন। উদাহরণ স্বরূপ:

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

যখন আমাদের পছন্দ থেকে অবজেক্টটি বের করতে হবে। নীচের মত কোড ব্যবহার করুন

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

হাই, আমি জানি এটি কিছুক্ষণ আগে পোস্ট করা হয়েছিল, তবে আপনি কি নিশ্চিত যে সঞ্চিত বস্তুটি বের করার জন্য আপনার কাছে থাকা কোডটি সঠিক? "নতুন অবজেক্ট ইনপুটস্ট্রিম (বাইটআরারি)" না করে সুস্পষ্ট নির্মাতাদের কীভাবে সংজ্ঞায়িত করা দরকার তা নিয়ে আমি শেষ 2 লাইনে একাধিক ত্রুটি পেয়েছি। সাহায্যের জন্য ধন্যবাদ!
ওয়াক্কা ওয়াক্কা ওয়াক্কা

হাই, আমি হঠাৎ ইন = নতুন অবজেক্টআইপুটস্ট্রিম (বেস 64 ইনপুটস্ট্রিম) এ একটি ইওএফএক্সেপশন পাচ্ছি; আপনি যা করছেন ঠিক তেমনভাবে এটি ভাগ করে নেওয়া প্রিফেসগুলিতে লিখছি। আপনার কী মনে হচ্ছে ভুল হতে পারে?
মেরিঙ্কে

আপনি যখন প্রিজে অবজেক্ট লেখেন তখন কি আপনার কোনও ব্যতিক্রম আছে? এসডিকে থেকে: যখন কোনও ইনপুট ক্রিয়াকলাপের সময় কোনও প্রোগ্রাম কোনও ফাইল বা স্ট্রিমের শেষের মুখোমুখি হয় তখন ইওএফএক্সেপশনটি নিক্ষেপ করা হয়।
কিসলিংক

কুডোস, এই সমস্যার সমাধান আমি এ পর্যন্ত করেছি। কোনও নির্ভরতা নেই। তবে এটি লক্ষ্য করা উচিত যে কোনও বস্তুর জন্য অবজেক্টআউটপুট / ইনপুটস্ট্রিম ব্যবহার করতে সক্ষম হওয়ার জন্য, উল্লিখিত অবজেক্ট এবং এর মধ্যে থাকা সমস্ত কাস্টম অবজেক্টকে সিরিয়ালাইজযোগ্য ইন্টারফেসটি প্রয়োগ করতে হবে।
ব্যবহারকারী 1112789

8

আমারও একই সমস্যা ছিল, আমার সমাধানটি এখানে:

আমার কাছে ক্লাস মাইক্লাস এবং অ্যারেলিস্ট <মাই ক্লাস> রয়েছে যা আমি ভাগ করা পছন্দগুলিতে সংরক্ষণ করতে চাই। প্রথমে আমি মাই ক্লাসে একটি পদ্ধতি যুক্ত করেছি যা এটিকে JSON অবজেক্টে রূপান্তর করে:

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

তারপরে "অ্যারেলিস্ট <মাই ক্লাস> আইটেমগুলি" সংরক্ষণ করার পদ্ধতিটি এখানে রয়েছে:

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

এবং অবজেক্টটি পুনরুদ্ধারের জন্য এখানে পদ্ধতি:

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

নোট করুন যে ভাগ করা পছন্দগুলিতে স্ট্রিংসেট এপিআই 11-এর পরে উপলব্ধ।


আমার সমস্যার সমাধান। আমি কিছু যুক্ত করতে চাই প্রথম ব্যবহারের জন্য আমাদের অবশ্যই সেটটি খালি আছে কিনা তা পরীক্ষা করে দেখতে হবে। যদি (সেট! = নাল) {এর জন্য (স্ট্রিং গুলি: সেট) {..}}
xevser

@ এক্সভার আমি পরামর্শ অনুসারে নাল চেক যুক্ত করেছি। ধন্যবাদ।
মাইক্রার

6

গসন লাইব্রেরি ব্যবহার:

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

দোকান:

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

পুনরুদ্ধার করুন:

String json = getPrefs().getUserJson();

পার্সেল কোনও সাধারণ-উদ্দেশ্য সিরিয়ালাইজেশন প্রক্রিয়া নয়। এই শ্রেণিটি (এবং পার্সেলে স্বেচ্ছাসেবী বস্তু স্থাপনের জন্য সংশ্লিষ্ট পার্সেলেবল এপিআই) একটি উচ্চ-পারফরম্যান্স আইপিসি পরিবহন হিসাবে ডিজাইন করা হয়েছে। যেমন, স্থির স্টোরেজে কোনও পার্সেল ডেটা স্থাপন করা উপযুক্ত নয়: পার্সেলের যে কোনও ডেটার অন্তর্নিহিত প্রয়োগের পরিবর্তনগুলি পুরানো ডেটা অপঠনযোগ্য রেন্ডার করতে পারে।
মার্কোস ভাসকনস্লোস

1

আপনি PowerPreference3 টি সহজ ধাপে লাইব্রেরি ব্যবহার করে এটি করতে পারেন !

https://github.com/AliAsadi/PowerPreference

1. অবজেক্ট তৈরি করুন

Object obj = new Object();

2. ভাগ করা পছন্দগুলিতে লিখুন

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

৩. বস্তুটি পাওয়া

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

0

এই বস্তুটি ব্যবহার করে -> টিনিডিবি - অ্যান্ড্রয়েড-ভাগ করা-পছন্দগুলি-টার্বো এটি খুব সহজ। আপনি এর সাথে অ্যারে, পূর্ণসংখ্যা, স্ট্রিং তালিকাগুলি ইত্যাদির সাহায্যে বেশিরভাগ ব্যবহৃত অবজেক্টগুলিকে সংরক্ষণ করতে পারেন


কুল, কিন্তু আমি এই মাত্র primitie প্রকার (স্ট্রিং, ডবল, int-, ইত্যাদি) কাস্টম অবজেক্টের জন্য না জন্য কাজ করে মনে (POJOS)
CommonSenseCode

এটি এখন কাস্টম অবজেক্টের জন্য কাজ করে,
রিডমি

0

তুমি ব্যবহার করতে পার আপনার পছন্দসই জিনিসগুলি সঞ্চয় করতে ফিলিপ সিলভেস্টের লাইব্রেরি দ্বারা - কমপ্লেক্স প্রেফারেন্স অ্যান্ড্রয়েড । মূলত, এটি জিনিসগুলি সঞ্চয় করতে GSON প্রক্রিয়া ব্যবহার করছে।

প্রিফেসগুলিতে অবজেক্টটি সংরক্ষণ করতে:

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

এবং এটি ফিরে পেতে:

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

পার্সেল কোনও সাধারণ-উদ্দেশ্য সিরিয়ালাইজেশন প্রক্রিয়া নয়। এই শ্রেণিটি (এবং পার্সেলে স্বেচ্ছাসেবী বস্তু স্থাপনের জন্য সংশ্লিষ্ট পার্সেলেবল এপিআই) একটি উচ্চ-পারফরম্যান্স আইপিসি পরিবহন হিসাবে ডিজাইন করা হয়েছে। যেমন, স্থির স্টোরেজে কোনও পার্সেল ডেটা স্থাপন করা উপযুক্ত নয়: পার্সেলের যে কোনও ডেটার অন্তর্নিহিত প্রয়োগের পরিবর্তনগুলি পুরানো ডেটা অপঠনযোগ্য রেন্ডার করতে পারে।
মার্কোস ভাসকনস্লোস

এটি
হ্রাস

0

গ্রেড বিল্ড.gradle ব্যবহার করে আপনি জিএসএন ব্যবহার করতে পারেন:

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

তারপরে আপনার কোডে উদাহরণস্বরূপ কোটলিনের সাথে স্ট্রিং / বুলিয়ানগুলির জোড়া:

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

শেয়ারডপ্রিফগুলিতে যুক্ত করা হচ্ছে:

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

এখন তথ্য পুনরুদ্ধার করতে:

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

পার্সেল কোনও সাধারণ-উদ্দেশ্য সিরিয়ালাইজেশন প্রক্রিয়া নয়। এই শ্রেণিটি (এবং পার্সেলে স্বেচ্ছাসেবী বস্তু স্থাপনের জন্য সংশ্লিষ্ট পার্সেলেবল এপিআই) একটি উচ্চ-পারফরম্যান্স আইপিসি পরিবহন হিসাবে ডিজাইন করা হয়েছে। যেমন, স্থির স্টোরেজে কোনও পার্সেল ডেটা স্থাপন করা উপযুক্ত নয়: পার্সেলের যে কোনও ডেটার অন্তর্নিহিত প্রয়োগের পরিবর্তনগুলি পুরানো ডেটা অপঠনযোগ্য রেন্ডার করতে পারে।
মার্কোস ভাসকনস্লোস

0

সাধারণ ভাগ করা অগ্রাধিকার (সিআরডি) ভাগ করা পছন্দ: সাধারণ কোটলিন শ্রেণীর সাথে মান-কী জোড়া আকারে ডেটা সঞ্চয় করতে pairs

var sp = SharedPreference(this);

তথ্য সংরক্ষণ

স্ট্রিং, ইন্ট এবং বুলিয়ান ডেটা সঞ্চয় করার জন্য আমাদের কাছে একই নাম এবং বিভিন্ন পরামিতিগুলির (পদ্ধতি ওভারলোডিং) তিনটি পদ্ধতি রয়েছে।

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

ডেটা পুনরুদ্ধার করুন: SharedPreferences এ সঞ্চিত ডেটা পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করুন।

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

সমস্ত ডেটা সাফ করুন: সম্পূর্ণ SharedPreferences সাফ করতে নীচের কোডটি ব্যবহার করুন।

 sp.clearSharedPreference()

নির্দিষ্ট ডেটা সরান:

sp.removeValue("user_name")

সাধারণ অংশীদারি পছন্দ ক্লাস

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

ব্লগ: https://androidkeynotes.blogspot.com/2020/02/shared-preferences.html


-2

SharedPreferences এ অবজেক্টগুলি সংরক্ষণ করার কোনও উপায় নেই, আমি যা করেছি তা হল একটি সার্বজনীন বর্গ তৈরি করা, আমার প্রয়োজনীয় সমস্ত প্যারামিটার স্থাপন করা এবং সেটার এবং গেটার তৈরি করা, আমি আমার অবজেক্টগুলিতে অ্যাক্সেস করতে সক্ষম হয়েছি,


-3

অ্যাপ্লিকেশনটি বন্ধ হয়ে যাওয়ার পরেও বা ঠিক চলছে যখন আপনার অবজেক্টটি পুনরুদ্ধার করা দরকার?

আপনি এটি একটি ডাটাবেসে সংরক্ষণ করতে পারেন।
অথবা কেবল একটি কাস্টম অ্যাপ্লিকেশন ক্লাস তৈরি করুন।

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>

এবং তারপরে প্রতিটি ক্রিয়াকলাপ থেকে:

((MyApplication) getApplication).getMyObject();

সত্যিকারের সেরা উপায় নয় তবে এটি কাজ করে।


-6

হ্যাঁ। আপনি Sharedpreferences ব্যবহার করে অবজেক্টটি সঞ্চয় এবং পুনরুদ্ধার করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.