दिलचस्प पोस्ट
दूसरे स्ट्रिंग के स्थान x पर स्ट्रिंग डालें जावा में BigDecimal का वर्गमूल Process.fork के लिए एक प्रतिस्थापन के रूप में प्रक्रिया। Spawn का उपयोग करना `% में%` और `==` में अंतर किसी अन्य वेबपेज पर कैसे पुनर्निर्देशित किया जा सकता है? नेस्टेड लूप का बिग-ओ क्या है, जहां आंतरिक लूप में पुनरावृत्तियों की संख्या बाहरी लूप की वर्तमान पुनरावृत्ति से निर्धारित होती है? लैम्ब्डा भावों में रेफरी या आउट पैरामीटर का उपयोग नहीं किया जा सकता MySQL – एक सिंगल इनसेट स्टेटमेंट में कितनी पंक्तियाँ सम्मिलित कर सकती हैं I JSON में हाइपरटेक्स्ट एप्लीकेशन लैंग्वेज (एचएएल) अक्षम करें? वर्तमान संदर्भ में नाम 'व्यूबैग' मौजूद नहीं है कैसे! = और == ऑपरेटर जावा में इंटीजर्स पर काम करते हैं? कैसे MVC 4 सूची मॉडल बाध्यकारी काम करता है? एचटीएमएल पेज में सर्कल कैसे बनाएं? क्लास को किसी अन्य श्रेणी में डालें या क्लास को दूसरे में कनवर्ट करें SetPlugins सक्षम नहीं WebView के लिए मौजूद है

पूरी तरह से योग्य डीबी पथ नाम के साथ SQLiteOpenHelper समस्या

मेरे ऐप में, मैं …

myFilesDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + packageName + "/files"); myFilesDir.mkdirs(); 

यह ठीक है और परिणामस्वरूप पथ है …

 /mnt/sdcard/Android/data/com.mycompany.myApp/files 

मुझे एक एसक्यूएलआईटी डीबी की आवश्यकता है जो मैं एसडी कार्ड पर स्टोर करना चाहता हूं ताकि मैं इस प्रकार SQLiteOpenHelper का विस्तार करूँ …

 public class myDbHelper extends SQLiteOpenHelper { public myDbHelper(Context context, String name, CursorFactory factory, int version) { // NOTE I prefix the full path of my files directory to 'name' super(context, myFilesDir + "/" + name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { // Create tables and populate with default data... } } 

अब तक इतनी अच्छी है – पहली बार मैं कॉल getReadableDatabase() करता हूं getReadableDatabase() या getWriteableDatabase() खाली डीबी एसडी कार्ड पर बनाया जाता है और इसे बनाने पर getWriteableDatabase() करता है।

तो यहां समस्या है – ऐप बीटा परीक्षण में 5 या 6 लोगों के साथ है और मेरे जैसे, वे एंड्रॉइड v2.2 चला रहे हैं और सब कुछ ठीक काम करता है। मेरे पास एक परीक्षक है, हालांकि, v2.1 चल रहा है और जब myDbHelper पहले उपयोग पर डीबी बनाने की कोशिश करता है, तो यह निम्नलिखित के साथ क्रैश हो जाता है …

 E/AndroidRuntime( 3941): Caused by: java.lang.IllegalArgumentException: File /nand/Android/data/com.mycompany.myApp/files/myApp-DB.db3 contains a path separator E/AndroidRuntime( 3941): at android.app.ApplicationContext.makeFilename(ApplicationContext.java:1445) E/AndroidRuntime( 3941): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473) E/AndroidRuntime( 3941): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158) 

फाइल निर्देशिका के लिए पथ एक अजीब ("/ नंद") है क्योंकि यह आंतरिक मेमोरी है, हालांकि फोन की अपनी आंतरिक मेमोरी नहीं है – लेकिन यह इस डिवाइस के लिए getExternalStorageDirectory() द्वारा वापस पथ है।

मुझे तीन संभावित उत्तर मिल सकते हैं …

  1. यद्यपि v2.2 पर स्वीकार्य है, डीबी नाम के लिए पूर्णतः योग्य पथ निर्दिष्ट करने की सिफारिश नहीं की जाती है और पहले के संस्करणों पर विफल हो जाएगी
  2. एसडी कार्ड भंडारण के लिए पूरी तरह योग्य मार्ग स्वीकार्य हैं लेकिन "/ नंद" पथ को 'आंतरिक' के रूप में परिभाषित किया जा रहा है और इस मामले में केवल सापेक्ष पथ स्वीकार्य हैं
  3. कुछ और जो मुझे पूरी तरह से याद आ रही है

यदि उपरोक्त सभी या सभी लागू होते हैं तो मैं इसकी सराहना करता हूं अगर कोई मेरी सहायता कर सकता है, तो मुझे इस पर कैसे पहुंचना चाहिए I

धन्यवाद।

Solutions Collecting From Web of "पूरी तरह से योग्य डीबी पथ नाम के साथ SQLiteOpenHelper समस्या"

ऐतिहासिक रूप से, आप SQLiteOpenHelper साथ पथ का उपयोग करने में सक्षम नहीं हैं। यह केवल साधारण फ़ाइल नाम पर काम करता है मुझे एहसास नहीं हुआ कि उन्होंने एंड्रॉइड 2.2 में उस प्रतिबंध को आराम दिया।

यदि आप एसडी कार्ड पर डेटाबेस का उपयोग करना चाहते हैं, और आप एंड्रॉइड 2.1 और इससे पहले का समर्थन करना चाहते हैं, तो आप SQLiteOpenHelper उपयोग नहीं कर सकते।

माफ़ कीजिये!

यदि आप एक कस्टम ContextClass प्रदान करते हैं और यदि आप लक्ष्य निर्देशिका में लिखते हैं तो आप एक कस्टम पथ के साथ SQLiteOpenHelper का उपयोग कर सकते हैं।

 public class DatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 3; ..... DatabaseHelper(final Context context, String databaseName) { super(new DatabaseContext(context), databaseName, null, DATABASE_VERSION); } } 

और यहां कस्टम डेटाबेससंगीत वर्ग है जो सभी जादू करता है:

 class DatabaseContext extends ContextWrapper { private static final String DEBUG_CONTEXT = "DatabaseContext"; public DatabaseContext(Context base) { super(base); } @Override public File getDatabasePath(String name) { File sdcard = Environment.getExternalStorageDirectory(); String dbfile = sdcard.getAbsolutePath() + File.separator+ "databases" + File.separator + name; if (!dbfile.endsWith(".db")) { dbfile += ".db" ; } File result = new File(dbfile); if (!result.getParentFile().exists()) { result.getParentFile().mkdirs(); } if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN)) { Log.w(DEBUG_CONTEXT, "getDatabasePath(" + name + ") = " + result.getAbsolutePath()); } return result; } /* this version is called for android devices >= api-11. thank to @damccull for fixing this. */ @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { return openOrCreateDatabase(name,mode, factory); } /* this version is called for android devices < api-11 */ @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); // SQLiteDatabase result = super.openOrCreateDatabase(name, mode, factory); if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN)) { Log.w(DEBUG_CONTEXT, "openOrCreateDatabase(" + name + ",,) = " + result.getPath()); } return result; } } 

जून 2012 अपडेट करें:
यह कैसे काम करता है (@ बाड़ी प्रश्न):

सामान्य एंड्रॉइड ऐप्स में ऐप फ़ोल्डर के सापेक्ष उनके स्थानीय डाटाबेस फाइल हैं। अधिलेखित getDatabasePath() के साथ एक ग्राहक संदर्भ का उपयोग करके डेटाबेस अब एसडी कार्ड पर एक अलग निर्देशिका के सापेक्ष है।

अपडेट फरवरी 2015:
मेरे एंड्रॉइड -2.2 डिवाइस को एक नए एंड्रॉइड -102 डिवाइस के स्थान पर लेने के बाद मुझे पता चला कि मेरा समाधान अब और काम नहीं करता। @ डीमैकाल-के उत्तर के लिए धन्यवाद मैं इसे ठीक करने में सक्षम था। मैंने इस उत्तर को अपडेट किया है, इसलिए यह फिर से एक काम का उदाहरण होना चाहिए।

अपडेट मई 2017:

आंकड़े: इस aproach 200 से अधिक github परियोजनाओं में प्रयोग किया जाता है

k3b का जवाब बढ़िया है यह मुझे काम कर रहा है हालांकि, API स्तर 11 या उच्चतर का उपयोग करने वाले उपकरणों पर, आप देख सकते हैं कि यह कार्य करना बंद कर देता है। यह इसलिए है क्योंकि openOrCreateDatabase () विधि का एक नया संस्करण जोड़ा गया था। इसमें अब निम्नलिखित हस्ताक्षर हैं:

 openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) 

यह इस पद्धति के साथ कुछ उपकरणों पर डिफ़ॉल्ट रूप से उपलब्ध विधि लगता है।

इन विधियों पर इस पद्धति का काम करने के लिए, आपको निम्नलिखित परिवर्तन करने होंगे:

सबसे पहले, अपनी मौजूदा विधि को संपादित करें ताकि वह कॉल के नतीजे नए तरीके से वापस कर सके।

 @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { return openOrCreateDatabase(name, mode, factory, null); } 

दूसरा, निम्नलिखित कोड के साथ नई ओवरराइड जोड़ें

 @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) { SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(),null,errorHandler); return result; } 

यह कोड K3b के कोड के समान है, लेकिन ध्यान रखें कि SQLiteDatabase.openOrCreateDatabase फ़ाइल की जगह एक स्ट्रिंग लेता है, और मैंने इसके संस्करण का उपयोग किया है जो कि DatabaseErrorHandler ऑब्जेक्ट के लिए अनुमति देता है।

user2371653 का जवाब बहुत अच्छा है। लेकिन मुझे कोई समस्या मिली:

 @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { return openOrCreateDatabase(name, mode, factory, null); } 

यह crasd कारण हो सकता है, अगर एंड्रॉइड 2.x पर अपने ऐप स्थापित कर सकते हैं

इसलिए हम इसे इस तरह संशोधित कर सकते हैं

 @Override public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) { return super.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), mode, factory); } 

क्योंकि एंड्रॉइड 2.x में एपीआई नहीं है

 openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) 

मेरी राय में मुझे इस तरफ ( एसडी कार्ड पर SQLite डेटाबेस ) एक बेहतर समाधान मिला है और आपको सूचित करना है कन्स्ट्रक्टर में प्रवेश की सूचना दें

 public class TestDB extends SQLiteOpenHelper { private static final String DATABASE_NAME = "usertest.db"; private static final int DATABASE_VERSION = 1; public TestDB (Context context){ super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION ); } ... } 

उपयोगकर्ता वेबसाइट से उद्धरण:
"यह एसडीसीडी / एसडीकार्ड / एंड्रॉइड / डेटा / [अपने_पैकेज_नाव] / फाइलों पर एप के फ़ोल्डर में डाटाबेस बनाएगा। इस तरह से एंड्रॉइड द्वारा ऐप के भाग के रूप में डाटाबेस को देखा जाएगा और स्वचालित रूप से हटा दिया जाएगा, अगर उपयोगकर्ता ने इसे अनइंस्टॉल किया है एप्लिकेशन। "

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