2011-01-26 13 views
12

पर SQLite डेटाबेस मैं एसडी कार्ड पर एक एसक्लाइट डेटाबेस बनाना चाहता हूं (उपयोगकर्ता के आंतरिक भंडारण का उपयोग नहीं करना चाहता)। मैं OpenHelper पैटर्न से परिचित हूँ:एसडी कार्ड

public DatabaseFoo(Context context) { 
    OpenHelper openHelper = new OpenHelper(context); 
    mDb = openHelper.getWritableDatabase(); 
} 

private static class OpenHelper extends SQLiteOpenHelper { 
    public OpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    ... 
तो

हम एसडी कार्ड पर बनाना चाहते हैं, मुझे लगता है कि बजाय हम उपयोग करने के लिए:

public static SQLiteDatabase openOrCreateDatabase (String path, 
     SQLiteDatabase.CursorFactory factory); 

लेकिन क्या "फैक्टरी" तर्क है माना जाता है, किस कारखाने का उपयोग किया जाना चाहिए?

इसके अलावा एक सा क्या होता अगर उपयोगकर्ता एसडी कार्ड को हटा जबकि मेरी ऐप्स उपयोग किए जाने के बारे में चिंतित ..

धन्यवाद

उत्तर

9

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

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

फिर भी, अगर आप इसे करने की कोशिश करना चाहते हैं, आप बंद ओवरराइड इस तरह अपने खुद के Application वस्तु के साथ के रूप में Context की getDatabasePath विधि, बेहतर हो सकता है, और फिर पारित कि एक नियमित SQLiteOpenHelper में। तो आपको कर्सर फैक्ट्री (जो वैकल्पिक है, as the source confirms) के बारे में चिंता करने की ज़रूरत नहीं है - तो अगर आप उस मार्ग पर जाना चाहते हैं तो बस शून्य हो जाएं)।

+0

या तो आवेदन या एक कस्टम ContextWrapper काम नहीं करता है में 'getDatabasePath' ओवरराइड में अनुमति जोड़ें। खुले सहायक स्रोत कोड को पढ़ते हुए, मैंने देखा कि विधि कभी नहीं कहा जाता है, और इसके बजाय यह 'mContext.openOrCreateDatabase'' को कॉल करता है जो डीबी को डिफ़ॉल्ट आंतरिक संग्रहण में बनाता है। तो इस विधि को भी ओवरराइड किया जाना चाहिए। –

+0

[यहां] (http://stackoverflow.com/questions/5332328/sqliteopenhelper-problem-with-fully-qualified-db-path-name/9168969#9168969) आप अधिलेखित getDatabasePath और openOrCreateDatabase का काम करने का एक उदाहरण उदाहरण पा सकते हैं जो काम करता है एंड्रॉइड 2.2 पर। और एंड्रॉइड 4.4 – k3b

2

कर्सर फैक्ट्री का उपयोग आपके कस्टम कर्सर कार्यान्वयन के उदाहरण को वापस करने के लिए किया जाता है। आम तौर पर आप केवल SQLiteCursor का उपयोग करते हैं, जिस स्थिति में नल फैक्ट्री तर्क के रूप में पारित किया जाता है।

1

मैं एक एसडी कार्ड पर डेटाबेस डालने के खिलाफ सिफारिश करता हूं - आप कार्ड की जीवनशैली में काफी कमी करेंगे, क्योंकि इसमें संभवतः लिखने की संख्या और बड़ी संख्या में लिखने की संख्या पर बड़ी (बड़ी, लेकिन अभी भी मौजूद) सीमा है लिखते हैं।

+0

हम्म को जीवनकाल के मुद्दे के बारे में पता नहीं था, जानना अच्छा है। – user291701

+1

हाय जेफ, मैं इस सीमा के बारे में कुछ और जानना चाहता हूं, क्या आप इस मुद्दे का बेहतर वर्णन करने वाले किसी भी लिंक को प्रदान कर सकते हैं? – Vignesh

+0

@ विग्नेस्ट: http://superuser.com/questions/17350/whats-the-life-expectancy-of-an-sd-card - एसडी कार्ड लिखने की सीमाएं। वह डेटाबेस बहुत सारे लेखन का उपयोग करते हैं, यह तकनीक का एक तथ्य है। – Jeff

3

फिर अपना खुद का फ्लैट डेटाबेस बनाएं - अधिकांश लोगों में बहुत कम आंतरिक मेमोरी होती है, और यह कष्टप्रद है कि वे इसे विशाल डेटाबेस के साथ खाते हैं।

और 'अगर वे एसडी' परिदृश्य को हटा दें तो क्या होगा - अगर उपयोगकर्ता कार्ड को हटा देता है तो जाहिर है कि यह काम नहीं करेगा! स्पष्ट रूप से। बस जांच करें कि आधार के साथ बातचीत करने का प्रयास करते समय आपको कोई त्रुटि नहीं मिली, और यदि आपने किया, तो बस आपको उपयोगकर्ता बताएं - समस्या हल हो गई है।

9

अपने SQLiteOpenHelper निर्माता में यह करें:/sdcard/एंड्रॉयड/डेटा/[your_package_name]/फ़ाइलें:

DatabaseHelper(Context context) { 
     super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION); 
    } 

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

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

1
public DataBaseHelper(final Context context) { 
    super(context, Environment.getExternalStorageDirectory() 
    + File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION); 
} 

इसके अलावा एंड्रॉयड प्रकट

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
संबंधित मुद्दे