2012-01-20 9 views
14

पहले के उन्नयन और Android एप्लिकेशन मैं एक खोज किया है और नहीं तो यहाँ जाता है मेरे सवाल का एक विशिष्ट उत्तर मिल सकता है एक ही SQLite डेटाबेस रखते हुए ...जब लाइट से प्रो संस्करण सभी की

मैं लिख रहा हूँ मेरा पहला एंड्रॉइड एप्लिकेशन और एक लाइट संस्करण (सीमित सुविधाएं) और एक भुगतान संस्करण (पूर्ण सुविधाएं) रखने की योजना है।

लाइट और प्रो संस्करण एक ही SQLite डेटाबेस संरचना का उपयोग करेगा, और यदि उपयोगकर्ता लाइट संस्करण से शुरू होता है और प्रो संस्करण में अपग्रेड करता है, तो मैं नहीं चाहता कि वे लाइट संस्करण में बनाए गए डेटा को खो दें।

चूंकि लाइट और प्रो संस्करण (मेरी समझ से) अलग-अलग पैकेजों में होना चाहिए ताकि एंड्रॉइड मार्केट उनके बीच अंतर कर सके, प्रो संस्करण लाइट डेटाबेस कैसे देख सकता है?

आपके उत्तरों के लिए अग्रिम धन्यवाद।

+0

यह http://stackoverflow.com/questions/7053809/share-sqlite-database का डुप्लिकेट प्रतीत होता है -बेटवीन-2-एंड्रॉइड-ऐप जहां एक उत्तर है (दूसरा एक नीचे)। –

+1

@EdJellard मुझे विश्वास नहीं है कि यह एक डुप्लिकेट है।जबकि प्रश्न _similar_ हैं, वे अलग हैं। यह सवाल डीबी को दो ऐप्स के बीच साझा करने के बारे में पूछ रहा है, न कि _same_ ऐप के दो संस्करणों के लिए। –

+0

धन्यवाद, मैं एक नज़र डालेगा। –

उत्तर

12

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

android:sharedUserId सेट दोनों उत्पादों में एक ही हो ...

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.mycompany.package" 
     android:sharedUserId="com.mycompany.package" <---- IMPORTANT 
     android:versionCode="10" 
     android:versionName="@string/app_version" 
     android:installLocation="auto"> 

और फिर डीबी कॉपी करने के लिए कोड ...

try { 
     final Context free_context = this.createPackageContext("com.mycompany.package", Context.CONTEXT_INCLUDE_CODE); 
     final File full_db  = this.getDatabasePath(GameData.DATABASE_NAME); 
     final File full_db_dir = full_db.getParentFile(); 
     final File free_db  = free_context.getDatabasePath(GameData.DATABASE_NAME); 
     final File free_db_dir = free_db.getParentFile(); 

     if (free_db.exists() == false)  return; 
     if (full_db_dir.exists() == false) full_db_dir.mkdir(); 
     if (full_db.exists() == false)  full_db.createNewFile(); 

     FileUtils.copyDirectory(free_db_dir, full_db_dir); 
     this.gameData.getWritableDatabase(); 
    } 
    catch (NameNotFoundException e) { 
     /* do nothing here since this is an semi expected case */ 
     Log.w("mytag", "No Lite version found"); 
    } catch (IOException e) { 
     Log.w("mytag", "Failed to create file"); 
    } 
} 

इस का केवल नकारात्मक पक्ष यह है कि एक बार है प्रतिलिपि की जाती है, दो संस्करणों के बीच कोई सिंक्रनाइज़ नहीं होता है। आपको यह भी सुनिश्चित करना होगा कि लाइट संस्करण का उपयोगकर्ता एक संस्करण चला रहा है जो sharedUserId के रूप में चल रहा है या प्रतिलिपि विफल हो जाएगी।

अद्यतन: कृपया क्रिस कैशवेल की टिप्पणियों पर विचार करें और जवाब दें क्योंकि वह एक वैध बिंदु लाता है और मुझे याद नहीं है कि मैंने उसके उदाहरण में क्या किया है।

+0

मैं बस एक ही समाधान का प्रस्ताव देना चाहता था। बस इस जवाब में जोड़ने के लिए आपको एंड्रॉइड को देखना चाहिए: manifestUserId पैरामीटर मेनिफेस्ट फ़ाइल में। – Yury

+0

इसके लिए 'sharedUserId' होना आवश्यक है, लेकिन यह व्यवहार्य समाधान हो सकता है। यदि आपके पास पहले से 'sharedUserId' सेट नहीं है, तो एक अपडेट भेज रहा है जो * करता है * एक सेट का मतलब उसी डीबी तक ऐप की पहुंच को अमान्य कर देना होगा। –

+0

@ क्रिसशैशवेल: क्या आप इसके बारे में 100% निश्चित हैं? मुझे लगता है कि समस्या है लेकिन मैंने सोचा कि मैंने इसके आसपास काम किया है। या तो मैंने या शुरुआत से ही सोचा था। मेरा जवाब अपडेट कर रहा है। –

2

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

उसी android:sharedUserId का उपयोग करना एक अच्छा दृष्टिकोण होगा यदि आपके ऐप में पहले से ही एक सेट है। यदि नहीं, तो आप अपने सभी उपयोगकर्ताओं के डेटा तक पहुंच को अमान्य कर देंगे यदि आप एक अपडेट भेजते हैं जिसमें एक सेट है। यदि आप स्क्वायर शून्य से शुरू कर रहे हैं और पहले से ही जंगली में ऐप नहीं है, तो उपयोगकर्ता अपने डेटा को रखने की उम्मीद कर रहे हैं, निश्चित रूप से पहले दिन से sharedUserId सेट करें।

+0

हां एक ही एप्लिकेशन एक वांछनीय विकल्प लगता है, क्योंकि यह चीजों को सरल रखता है। मेरा ऐप अभी भी विकास में है इसलिए फिलहाल मैं विचारों के लिए खुला हूं ... विचार के लिए भोजन! –

+0

@ गुआर्डियनएंजेल यह बाद में प्रबंधित करना आसान बनाता है। उदाहरण के लिए, आपको एक बग मिलती है, क्या आप इसे दो अलग-अलग ऐप्स (फ्री और पेड) या बस एक में ठीक करना चाहते हैं? –

1

जैसा कि @ क्रिस ने बताया कि आप "अनलॉक" दृष्टिकोण का उपयोग कर सकते हैं, मैं इसे समझाऊंगा कि मैं ऐसी स्थितियों में कैसे करता हूं।

आपके पास 'फीचर्स' जैसी तालिका हो सकती है जिसमें कॉलम/ध्वज होना चाहिए। यदि आप कुछ विशेषताओं को प्रतिबंधित करना चाहते हैं तो आप अपने उपलब्ध ध्वज को FALSE पर सेट कर सकते हैं।

आप डीबी संरचना में परिवर्तन है, तो आप उपयोग कर डीबी नवीनीकृत करना चाहिए:

@Override 
public void onUpgrade() 
{ 
    if (condition == true) 
    // alter table 
} 
संबंधित मुद्दे