2012-06-09 17 views
39

मैंने हाल ही में एक एंड्रॉइड ऐप को कोड किया है। यह सिर्फ एक साधारण ऐप है जो आपको कुछ सरल काउंटर अंतराल के साथ बास्केटबाल गेम का स्कोर रखने की अनुमति देता है। मुझे एक सेव फीचर जोड़ने की मांग मिल रही है, इसलिए आप अपने स्कोर को सेव कर सकते हैं और फिर उन्हें बैक अप ले सकते हैं। वर्तमान में, जब आप ऐप को रोकते हैं, तो आपका डेटा गुम हो जाता है। तो मैं क्या सोच रहा था कि ऐप को एक लेबल (स्कोर) सहेजने के लिए जोड़ना होगा और फिर इसे वापस लोड करना होगा। धन्यवाद दोस्तों क्षमा करें मैं इस सामान के बारे में ज्यादा नहीं जानता।एंड्रॉइड ऐप में डेटा को कैसे सहेजना है

उत्तर

4

उपयोग SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html

यहां एक नमूना है: http://developer.android.com/guide/topics/data/data-storage.html#pref

तो डेटा संरचना और अधिक जटिल है या डेटा बड़ी है, एक Sqlite डेटाबेस का उपयोग करें; लेकिन डेटा की थोड़ी मात्रा के लिए और एक बहुत ही सरल डेटा संरचना के साथ, मैं कहूंगा, SharedPrefs करेंगे और एक डीबी ओवरहेड हो सकता है।

+0

है कि सही। इससे कहीं अधिक जटिल का उपयोग करना सिर्फ ओवरकिल और गूंगा विचार है। साझा की गई सभी चीजें आवश्यक हैं। –

1
  1. साझा प्राथमिकताएं: android shared preferences example for high scores?

  2. करता है आपके आवेदन "बाह्य भंडारण मीडिया" के लिए एक पहुँच नहीं है। यदि ऐसा होता है तो आप फ़ाइल में केवल मूल्य (टाइमस्टैम्प के साथ स्टोर) लिख सकते हैं और इसे सहेज सकते हैं। टाइमस्टैम्प आपको प्रगति दिखाने में मदद करेगा यदि आप जो खोज रहे हैं। {स्मार्ट समाधान नहीं।}

+2

संबंधित 2) बाह्य भंडारण का उपयोग करने की कोई आवश्यकता नहीं है, जिसे हमेशा एक चेक की आवश्यकता होती है (चाहे एक एसडीकार्ड घुड़सवार हो)। ऐप के कैश या फ़ाइल डीआईआर का उपयोग क्यों न करें? (getFilesDir(), getCacheDir())। –

+0

@MathiasLin आपको एक पूर्ण उत्तर पोस्ट करना चाहिए। – thomasfedb

+0

@ थॉमसफेडब मैंने पहले ही इस प्रश्न का पहला जवाब पोस्ट किया है, और लिंक और लिंक किए गए नमूने के साथ, यह सब कुछ चाहिए। मुझे कुछ याद आया? –

0

मेरी राय में db4o जाने का सबसे आसान तरीका है। यहाँ आप एक ट्यूटोरियल पा सकते हैं: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

और यहाँ आप पुस्तकालय डाउनलोड कर सकते हैं:

http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip

(बस lib में db4o-8.0 ...- सभी java5.jar डाल आपके प्रोजेक्ट के libs फ़ोल्डर में निर्देशिका। यदि आपके प्रोजेक्ट में कोई libs फ़ोल्डर नहीं है तो इसे बनाएं)

जैसा कि db4o ऑब्जेक्ट उन्मुख डेटाबेस सिस्टम है, आप सीधे डेटाबेस में ऑब्जेक्ट्स को सहेज सकते हैं और बाद में उन्हें वापस ले सकते हैं।

+0

db4o मुझे थोड़ा ओवरहेड की तरह दिखता है। यदि बिल्कुल, एक एसक्लाइट डीबी शायद एंड्रॉइड के समर्थन के कारण आसान हो जाएगा, हालांकि बहुत कम बुनियादी डेटा के लिए, मैं कहूंगा, SharedPrefs पर्याप्त होगा। –

+0

मेरी राय में डीबी 4o विशेष रूप से शुरुआती लोगों के लिए एसक्यूएल से बहुत आसान है। और इस बदसूरत साझा prefs के मुकाबले कम झुकाव :-) – fivef

+0

थोड़ा ऑफ-विषय - लेकिन ...: मैंने गैर-एंड्रॉइड प्रोजेक्ट्स के लिए लंबे समय पहले db4o में देखा है, और विचार खराब नहीं है; मुझे डीबी 4o के बारे में क्या पसंद नहीं है यह है कि यह मालिकाना है। यदि आप सीधे एसक्यूएल से निपटने से बचना चाहते हैं, तो मैं ORMLite को ओआरएम लाइब्रेरी (ORM = ऑब्जेक्ट-रिलेशनल-मैपिंग) के रूप में भी अनुशंसा कर सकता हूं। फिर भी, मुझे लगता है कि डीबी 4o इस तरह के कार्य के लिए भी अच्छा काम करेगा, इसमें कोई संदेह नहीं है। –

53

आपके पास दो विकल्प हैं, और मैं आपको चयन छोड़ दूंगा।

  1. साझा पसंद

    यह (जैसे int, boolean, और String हालांकि सख्ती से बोला String एक आदिम नहीं है) एक रूपरेखा एंड्रॉयड के लिए अद्वितीय है कि आप आदिम मान संग्रहीत करने की अनुमति देता है एक कुंजी में मूल्य ढांचा। इसका मतलब यह है कि आप एक मान देते हैं, "होमस्कोर" कहें, और इस कुंजी को मान स्टोर करें।

    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putInt("homeScore", YOUR_HOME_SCORE); 
    
    // Apply the edits! 
    editor.apply(); 
    
    // Get from the SharedPreferences 
    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); 
    int homeScore = settings.getInt("homeScore", 0); 
    
  2. मोबाइल मेमोरी

    यह, मेरी राय में, आप जो खोज हो सकता है। आप जो भी फाइल चाहते हैं उसे स्टोर कर सकते हैं, इसलिए यह आपको अधिक लचीलापन देता है। हालांकि, प्रक्रिया ट्रिकियर हो सकती है क्योंकि सबकुछ बाइट्स के रूप में संग्रहीत किया जाएगा, और इसका मतलब है कि आपको अपने पढ़ने और लिखने की प्रक्रियाओं को एक साथ काम करने के लिए सावधान रहना होगा।

    int homeScore; 
    byte[] homeScoreBytes; 
    
    homeScoreBytes[0] = (byte) homeScore; 
    homeScoreBytes[1] = (byte) (homeScore >> 8); //you can probably skip these two 
    homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a     
                   //basketball score above 128, it's 
                   //such a rare occurance. 
    
    FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE); 
    outputStream.write(homeScoreBytes); 
    outputStream.close(); 
    

अब, आप भी External Storage पर गौर कर सकते हैं, लेकिन मुझे लगता है कि अनुशंसा नहीं करते हैं इस विशेष मामले में, क्योंकि बाहरी संग्रहण वहाँ बाद में नहीं हो सकता है। (ध्यान दें कि यदि आप इसे चुनते हैं, तो उसे अनुमति की आवश्यकता है)

+14

एलओएल - मुझे यह टिप्पणी पसंद है "क्योंकि मैंने कभी 128 से ऊपर बास्केटबॉल स्कोर नहीं देखा है" :-) बीटीडब्ल्यू: आपके संदर्भ के लिए: http://www.nba.com/pistons/news/highest_score_071211.html –

+6

हाइरल में, जिंदा सबसे अमीर आदमी केवल 255 रुपये हो सकता है। ;) – Neil

+0

मुझे लगता है कि आप भंडारण – monim

10

ओपी एक "सेव" फ़ंक्शन मांग रहा है, जो केवल प्रोग्राम के निष्पादन में डेटा को संरक्षित करने से अधिक है (जो आपको ऐप के लायक होने के लिए करना चाहिए कुछ भी।)

मैं एसडीकार्ड पर एक फ़ाइल में डेटा को सहेजने की अनुशंसा करता हूं जो आपको बाद में इसे याद करने की अनुमति नहीं देता है, लेकिन उपयोगकर्ता को अपने कंप्यूटर पर बाहरी ड्राइव के रूप में डिवाइस को घुमाने और उपयोग के लिए डेटा को पकड़ने की अनुमति देता है अन्य स्थानों पर।

1) को लागू करें onSaveInstanceState():

तो तुम सच में एक बहु अंक प्रणाली की जरूरत है। इस विधि में, आप एक बंडल पास कर चुके हैं, जो मूल रूप से एक शब्दकोश की तरह है। बंडल में जितनी अधिक जानकारी स्टोर करें उतनी ही ऐप को पुनरारंभ करने के लिए जरूरी है जहां इसे छोड़ा गया था। अपने onCreate() विधि में, पास-इन बंडल को गैर-शून्य होने के लिए जांचें, और यदि ऐसा है, तो राज्य को बंडल से पुनर्स्थापित करें।

2) onPause() लागू करें। इस विधि में, साझा किए गए संदर्भ संपादक बनाएं और अगली बार ऐप शुरू करने के लिए आपको जो भी स्थिति चाहिए उसे सहेजने के लिए इसका उपयोग करें। इसमें मुख्य रूप से उपयोगकर्ताओं की प्राथमिकताओं (इसलिए नाम) शामिल होता है, लेकिन ऐप के स्टार्ट-अप राज्य से संबंधित कुछ और भी यहां जाना चाहिए। मैं स्टोर स्कोर यहां नहीं रखूंगा, केवल ऐप को पुनरारंभ करने के लिए आपको जो सामान चाहिए। फिर, onCreate() में, जब भी कोई बंडल ऑब्जेक्ट नहीं होता है, तो उन सेटिंग्स को याद करने के लिए SharedPreferences इंटरफ़ेस का उपयोग करें।

3a) स्कोर जैसी चीजों के लिए के रूप में, आप ऊपर मैथियास की सलाह का पालन कर सकता है और निर्देशिका getFilesDir() में वापस लौटने वाले स्कोर की दुकान, openFileOutput() का उपयोग कर, आदि मुझे लगता है कि इस निर्देशिका के अनुप्रयोग के लिए निजी है और मुख्य भंडारण, अर्थ में रहती है कि अन्य ऐप्स और उपयोगकर्ता डेटा तक पहुंच नहीं पाएंगे। यदि यह आपके साथ ठीक है, तो शायद यह जाने का रास्ता है।

3b) यदि आप अन्य ऐप्स या उपयोगकर्ता को डेटा तक सीधे पहुंच प्राप्त करना चाहते हैं, या यदि डेटा बहुत बड़ा होने वाला है, तो sdcard जाने का तरीका है। अन्य अनुप्रयोगों के साथ टक्कर से बचने के लिए कॉम/उपयोगकर्ता 1446371/बास्केटबाल/जैसे निर्देशिका नाम चुनें (जब तक कि आप सुनिश्चित न हों कि आपका ऐप नाम उचित रूप से अद्वितीय है) और उस निर्देशिका को एसडीकार्ड पर बनाएं। जैसा कि माथीस ने बताया, आपको पहले पुष्टि करनी चाहिए कि एसडीकार्ड घुड़सवार है।

File sdcard = Environment.getExternalStorageDirectory(); 
if(sdcard == null || !sdcard.isDirectory()) { 
    fail("sdcard not available"); 
} 
File datadir = new File(sdcard, "com/user1446371/basketballapp/"); 
if(!datadir.exists() && !datadir.mkdirs()) { 
    fail("unable to create data directory"); 
} 
if(!datadir.isDirectory()) { 
    fail("exists, but is not a directory"); 
} 
// Now use regular java I/O to read and write files to data directory 

मैं आपके डेटा के लिए सरल सीएसवी फाइलों की अनुशंसा करता हूं, ताकि अन्य एप्लिकेशन उन्हें आसानी से पढ़ सकें।

जाहिर है, आपको उन गतिविधियों को लिखना होगा जो "सहेजने" और "खुले" संवाद की अनुमति देते हैं। मैं आमतौर पर ओपनिंट्स फ़ाइल मैनेजर को कॉल करता हूं और इसे काम करने देता हूं। यह आवश्यक है कि आपके उपयोगकर्ता इन सुविधाओं का उपयोग करने के लिए ओपनिंटेंट फ़ाइल प्रबंधक स्थापित करें।

+0

एक और टिप्पणी: यदि बिलकुल भी संभव है, एक अलग धागे, विशेष रूप से लेखन में पढ़ने और लिखना। अन्यथा, आपका ऐप फ्रीज हो जाता है और उपयोगकर्ता के पास कम से कम इष्टतम अनुभव होता है। –

0

कृपया एक चीज़ को न भूलें - जब आप ऐप को अनइंस्टॉल करते हैं तो आंतरिक संग्रहण डेटा हटा दिया जाता है। कुछ मामलों में यह "अप्रत्याशित सुविधा" हो सकती है। फिर बाहरी भंडारण का उपयोग करना अच्छा होता है।

Google docs about storage - कृपया getExternalStoragePublicDirectory पर विशेष रूप से देखने के लिए

3

वहाँ विकल्पों में से एक बहुत कुछ अपने डेटा स्टोर करने के लिए है और एंड्रॉयड किसी आपका डेटा भंडारण विकल्प हैं चुना के लिए निम्न आप प्रदान करता है:

साझा पसंद स्टोर कुंजी-मूल्य जोड़े में निजी आदिम डेटा। आंतरिक संग्रहण डिवाइस मेमोरी पर निजी डेटा स्टोर करें। बाहरी संग्रहण साझा बाहरी संग्रहण पर सार्वजनिक डेटा स्टोर करें। SQLite डेटाबेस एक निजी डेटाबेस में संरचित डेटा स्टोर करें। नेटवर्क कनेक्शन स्टोर अपने स्वयं के नेटवर्क सर्वर के साथ वेब पर डेटा

उदाहरण के लिए चेक here और tuto

7

onCreate में:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); 

    String mySetting = sharedPref.getString("mySetting", null); 

OnDestroy में या समकक्ष:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); 

    SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putString("mySetting", "Hello Android"); 
    editor.commit(); 
संबंधित मुद्दे