2011-11-19 20 views
6

मेरे पास एक ऐसा ऐप है जो SQLite डेटाबेस का उपयोग करता है। जब ऐप इस समय अद्यतन करता है तो यह डेटाबेस को पूरी तरह से ओवरराइट करता है।एंड्रॉइड कैसे अपडेट करें, लेकिन डेटाबेस जानकारी को बनाए रखें

समस्या उत्पन्न होती है जब मैं उपयोगकर्ताओं को मौजूदा प्रगति को नए अपडेट में स्थानांतरित करना चाहता हूं। डीबी तालिका में प्रश्नों की पंक्तियां होती हैं। प्रत्येक पंक्ति में 1 प्रश्न, उत्तर, सही उत्तर का कारण होता है, चाहे उपयोगकर्ता ने इसका उत्तर दिया हो और यदि उपयोगकर्ता ने सही उत्तर दिया हो।

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

100 से अधिक पंक्तियों के साथ ऐसा लगता है कि यह बहुत संसाधन गहन होगा। हालांकि मैं इस समस्या के आसपास एक और रास्ता नहीं देख सकता।

कोई सलाह और सहायता आभारी रूप से प्राप्त की जाएगी।

+1

उत्तरों सवालों पर एक रेफरेंसियल बाधा होना चाहिए। उत्तर तालिका प्रश्नोत्तरी है। फिर आप प्रश्नों को बदलकर इसे तोड़ नहीं सकते हैं। – danny117

+0

@Anene क्या आपने अपडेट का उपयोग करने का प्रयास किया था, जहां प्रश्न को हटाने के लिए क्लॉज है जो आपके क्रिएटिया को संतुष्ट नहीं करता है? –

उत्तर

3

मैं @ यशवंत कुमार से सहमत हूं कि एक अलग डिजाइन बेहतर दीर्घकालिक हो सकता है, लेकिन 100 पंक्तियां भारी नहीं हैं।

DBhelper.onUpgrade() में तर्क लागू करें।

आप अद्यतन वरीयताओं में उत्तरों को संग्रहीत करना चाहते हैं, जबकि अद्यतन ऑपरेशन हो रहा है इसे सिस्टम/उपयोगकर्ता द्वारा मार डाला गया है।

+0

सलाह के लिए धन्यवाद क्या आप संभवतः साझा किए गए प्राइस में डेटा को स्टोर करने के तरीके पर मुझे कोई लिंक प्रदान कर सकते हैं। – Somk

+0

यहां कुछ उदाहरण कोड के साथ एक प्रश्न है, http://stackoverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values ​​लेकिन tbh google it – scottyab

0

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

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

+0

अच्छी योजना केवल समस्या यह है कि एक अद्यतन में मैं उत्तर दिए गए प्रश्नों से सामग्री बदल सकता हूं। उदाहरण के लिए शब्द बदलें या वर्तनी गलती संपादित करें। यही कारण है कि मैं सब कुछ छोड़ने के लिए इस दृष्टिकोण के साथ आया हूं और केवल उपयोगकर्ता विशिष्ट जानकारी स्थानांतरित कर रहा हूं। – Somk

+0

जो खोज की समस्या को बचाएगा, जो आपके अनुमान के लिए क्षतिपूर्ति करेगा। यह उपर्युक्त चीजों के बीच सिर्फ व्यापार बंद है। –

6

पहले आवंटित प्रत्येक तालिका में एक विशिष्ट आईडी - प्राथमिक कुंजी (पी)

प्रश्न तालिका - एक के बाद एक प्रश्न
के साथ संबंध के लिए उपयोगकर्ता तालिका - - एक कई रिश्ते को साथ उपयोगकर्ता
उत्तर तालिका एक रिश्ता बनाने के लिए कई प्रश्न

 
Question 
+--------------+------------+------------------+ 
| int   | Id   | PK    | 
| varchar(max) | question |     | 
| int   | userId  | FK (Foreign Key) | 
| bool   | answered |     | 
| bool   | correct |     | 
+--------------+------------+------------------+ 

Answer 
+--------------+------------+----+ 
| int   | Id   | PK | 
| int   | questionId | FK | 
| varchar(max) | reason  | | 
+--------------+------------+----+ 

User 
+---------------+-------------+--------------------------------------------+ 
| int   | Id   | PK           | 
| varchar (250) | deviceToken | (UUiD) // some unique identifier per phone | 
+---------------+-------------+--------------------------------------------+ 
// other relevant stuff 

जब ऐप डाउनलोड किया जाता है तो उपयोगकर्ता को यूयूआईडी का उपयोग करके चुपचाप पंजीकृत किया जा सकता है। केंद्रीय डेटाबेस को इन सभी सवालों को ट्रैक करने और फिर से शुरू करने के बजाय उत्तर देने वाले प्रश्नों का ट्रैक रखने की आवश्यकता होगी। 100 पंक्तियां बहुत अधिक नहीं हैं लेकिन उपयोगकर्ता संभावित रूप से 1000s या अधिक में भाग सकते हैं। एक अपडेट में यह प्रासंगिक नहीं है कि फोन में स्थानीय डेटाबेस को दोबारा शुरू करना धीमा हो सकता है (हालांकि यह कई पंक्तियों के साथ धीमा नहीं होगा, लाखों पंक्तियों वाले डेटाबेस में समय लगेगा) क्योंकि उम्मीद है कि अपडेट लेते हैं पहर।

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

साझा प्राथमिकताओं का भी ऐप के लिए उपयोगकर्ता सेटिंग्स को सहेजने के लिए उपयोग किया जा सकता है, मुझे लगता है कि यह सौ प्रश्नों के लिए अधिक हो सकता है, यह SQLite डेटाबेस में इस जानकारी को स्टोर करने के लिए बेहतर होगा; जानकारी सर्वर पर रखा जा रहा है। जब भी कोई अपडेट होता है तो आप डेटा को मिटा नहीं सकते हैं, आपको उपभोक्ता की प्रगति के मौजूदा रिकॉर्ड रखना चाहिए। आप जानकारी को बनाए रखने के लिए उपभोक्ता के डिवाइस पर भरोसा नहीं कर सकते हैं। यदि कोई जानकारी है जिसे आप ट्रैक रखना चाहते हैं, आपको इसके लिए जिम्मेदारी लेनी होगी।

इसे स्थानीय रूप से फोन पर संग्रहीत किया जा सकता है और सर्वर से नियमित रूप से समन्वयित किया जा सकता है।

हमारे ऐप्स में, हम यह करते हैं कि हम इसे कैसे करते हैं और डेटा अपडेट से बचता है और हमारे पास लाखों पंक्तियां हैं। अधिक प्रश्न पूछने के लिए स्वतंत्र महसूस करें, हालांकि यह सब कुछ कैसे काम करता है इसके लिए एक वास्तविक ट्यूटोरियल (या कोड) देना स्टैक ओवरफ़्लो के लिए थोड़ा सा जवाब है।

+0

"स्वीकार्य उत्तर अपग्रेड पर डेटाबेस सहायक का उपयोग करने के लिए कहता है, इसका उपयोग केवल तभी किया जा सकता है जब डेटाबेस स्वयं ही बदला जा रहा हो, न कि ऐप अपडेट के लिए जिसमें कोई डेटाबेस परिवर्तन शामिल नहीं है।" - यह गलत है। किसी भी कारण से 'SQLiteOpenHelper' द्वारा उपयोग किए गए स्कीमा संस्करण को बढ़ाने के लिए आपका स्वागत है। – CommonsWare

+0

@CommonsWare ने उस भाग को हटा दिया और प्रतिक्रिया के लिए धन्यवाद। –

+0

@ कॉमन्सवेयर डेटाबेस स्कीमा परिवर्तन के बिना इसे कार्यान्वित करने का क्या मतलब होगा? –

संबंधित मुद्दे