मैं एक जावा बीन वस्तु जो serializable है कहो। मैं() एक गतिविधि OnDestroy माध्यम से चला जाता है जब यह दूर स्टोर करने के लिए सुरक्षित रूप से उद्देश्य पर (अर्थात onSaveInstanceState() नहीं कहा जाता है)।मैं गतिविधि पुनरारंभ भर में एक जटिल वस्तु कैसे बचाऊं?
मैं ऐसे तरीके की तलाश में हूं जिसमें डेटाबेस बनाने और ऑब्जेक्ट को लिखने में शामिल नहीं है (ज्यादातर तब से) एंड्रॉइड के डीबी एपीआई भयानक है और बी) चूंकि डेटाबेस एप्लिकेशन को दुःस्वप्न अपडेट करता है, क्योंकि कोई सभ्य नहीं है माइग्रेशन लागू करने के लिए समर्थन)।
मैं एक ByteArrayOutputStream करने के लिए वस्तु serializing बेस 64 एन्कोड कि और एक स्ट्रिंग के रूप में एक SharedPreferences फाइल करने के लिए इसे लिखने के बारे में सोचा। या वह बहुत दूर है?
अद्यतन
हो सकता है कि serialize-से-स्ट्रिंग विचार सब के बाद इतना बुरा नहीं था, बहुत अच्छी तरह से बाहर काम करने लगता है। यहाँ अब मैं क्या कर रहा है:
public static String objectToString(Serializable object) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
new ObjectOutputStream(out).writeObject(object);
byte[] data = out.toByteArray();
out.close();
out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out);
b64.write(data);
b64.close();
out.close();
return new String(out.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Object stringToObject(String encodedObject) {
try {
return new ObjectInputStream(new Base64InputStream(
new ByteArrayInputStream(encodedObject.getBytes()))).readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
OnDestroy में
() मैं तो बस एक वरीयता फ़ाइल है, जहां यह सुरक्षित है जब तक मैं इसे फिर से अगले गतिविधि लॉन्च के दौरान पढ़ने के लिए Base64 स्ट्रिंग लिख सकते हैं। यह मेरी अपेक्षा से बहुत तेज़ है और जब तक कि आपके सेम में बड़ी मात्रा में डेटा नहीं है, यह बहुत अच्छी तरह से काम करता है। और इससे भी बेहतर, आपको डीबी स्कीमा को बनाए रखने की ज़रूरत नहीं है।
फिर भी, मैं के बारे में कैसे दूसरों को ऐसा करने के उत्सुक हूँ।
यह सिर्फ बजाय बंडल का उपयोग करना संभव नहीं है? – JRL
कैसे? यदि आप अपनी गतिविधि SaveInstanceState() पर जाते हैं, तो आप केवल बंडल तक पहुंच सकते हैं, यानी जब इसे रनटाइम द्वारा नष्ट किया जा रहा है। – Matthias
बहुत बढ़िया! मैंने आपका दृष्टिकोण इस्तेमाल किया और यह काम करता है। केवल एंड्रॉइड एसडीके में बेस 64InputStream में केवल एक मुद्दा है जिसमें एक कन्स्ट्रक्टर नहीं है जिसमें एक पैरामीटर है जिसमें अब एक अतिरिक्त int ध्वज पैरामीटर है। यदि आपके पास ऑब्जेक्ट में कोई यूआरएल जानकारी है तो बस इसे 0 या 8 पर सेट करें। – JPM