2011-02-23 9 views
5

मैं एंड्रॉइड एप्लिकेशन में अपने SQLiteOpenHelper सबक्लास के लिए सम्मिलन और पुनर्प्राप्ति विधियों का परीक्षण करने की कोशिश कर रहा हूं। SQLLiteHelper सबक्लास परीक्षण के तहत ऐप में मौजूद है, और स्थापना फ़ोल्डर में डेटाबेस बनाता है। हालांकि, परीक्षण ऐप में यूनिट परीक्षण InstrumentTestCase में मौजूद है, और मैं परीक्षण ऐप में एक परीक्षण डेटाबेस बनाना चाहता हूं।एंड्रॉइड टेस्ट ऐप में डेटाबेस नहीं खोल सकता

android.database.sqlite.SQLiteException: unable to open database file 
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584) 
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638) 
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168) 
at com.kizoom.android.mybus.storage.MyStopsDatabase.getMyStops(MyStopsDatabase.java:63) 
at com.kizoom.mybus.test.MyStopsDatabaseTest.testGetMyStops(MyStopsDatabaseTest.java:24) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:191) 
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:181) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:425) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1520) 

The following information appears in LogCat. 

02-21 11:52:16.204: ERROR/Database(1454): sqlite3_open_v2("/data/data/com.kizoom.mybus.test/databases/MyStops", &handle, 6, NULL) failed 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): Couldn't open MyStops for writing (will try read-only): 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): android.database.sqlite.SQLiteException: unable to open database file 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584) 

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638) 

किसी को पता है क्यों यह विफल हो जाएगा:

दुर्भाग्य से, अगर मैं बनाने/परीक्षण अनुप्रयोग में एक डेटाबेस को खोलने का प्रयास, मैं निम्नलिखित अपवाद मिल सकता है?

+1

त्रुटि से पता चलता है कि आप अपना डेटाबेस नहीं बना रहे हैं - या संभवतः, आप इसे 'SQLiteOpenHelper.onCreate() 'के बाहर बना रहे हैं (क्योंकि इसे खोला नहीं जा सकता है) और इसलिए जब आप अन्य' SQLiteOpenHelper' सुविधा विधियों का उपयोग करते हैं, तो वे आपके डेटाबेस से अनजान हैं। कृपया अपना कोड पोस्ट करें जहां आप डेटाबेस बनाते हैं, और अपने उप-वर्गीकृत 'SQLiteOpenHelper' के लिए' onCreate'। – RivieraKid

+0

सही उत्तर यह है: http://stackoverflow.com/a/8488722/1432640 – stillwaiting

उत्तर

4

मैं निम्नलिखित सेटअप() का उपयोग करें - मेरी TestDatabaseHelper में विधि * -TestCases:

@Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     final SQLiteDatabase db = SQLiteDatabase.create(null); 
     Context context = new MockContext() { 
      @Override 
      public SQLiteDatabase openOrCreateDatabase(String file, int mode, SQLiteDatabase.CursorFactory factory) { 
       return db; 
      }; 
     }; 
     mHelper = new MyCustomSubclassOfDatabaseHelper(context); 
     mDb = mHelper.getWritableDatabase(); 
     wipeData(mDb); 
    } 
    public void wipeData(SQLiteDatabase db) { 
     db.execSQL("DELETE FROM " + TABLENAME + ";"); 
    } 

क्योंकि प्रलेखन SQLiteDatabase.create() के बारे में कहते हैं यह बहुत अच्छा है:

एक स्मृति का समर्थन किया बनाएं SQLite डेटाबेस। डेटाबेस बंद होने पर इसकी सामग्री नष्ट हो जाएगी।

तो आपका टेस्टडेटाबेस जारी नहीं है और आप आसानी से अपने कस्टम डालने/अपडेट/क्वेरी/डिलीट विधियों का परीक्षण कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है। यदि कोई प्रश्न बाकी है, तो पूछने के लिए स्वतंत्र महसूस करें।

चीयर्स, क्रिस्टोफ

+0

अरे @ चिस्टोफ wipedata विधि क्या है और मैं डेटाबेस ऑपरेशन का परीक्षण करने के लिए इसका उपयोग कैसे कर सकता हूं? धन्यवाद – Tony

+0

हाय @ टोनी, मुझे थोड़ी देर लग गई 4 साल पहले से कोड ढूंढने के लिए (सवाल वास्तव में 5 साल पुराना है)। मैंने wipeData को शामिल करने के लिए कोड उदाहरण अपडेट किया है, एक नज़र डालें। विचार यह है कि अब आप बिना किसी चिंता के डेटाबेस डेटाबेस का परीक्षण कर सकते हैं कि अन्य testruns से SQLiteDatabase में डेटा शेष है। –

+0

धन्यवाद बहुत, मैं इसे देखूंगा – Tony

30
इसके बजाय db सहायक के बनाने के दौरान संदर्भ के लिए getInstrumentation().getContext() का उपयोग करने का

, मैं इसे getInstrumentation().getTargetContext() को बदल दिया है और यह काम करता है।

+0

धन्यवाद, यह चाल है! – David

+0

इंस्ट्रूमेंटेशन # getContext() के बीच एक बहुत ही वास्तविक भिन्नता है जो परीक्षण अनुप्रयोग और इंस्ट्रुमेंटेशन # getTargetContext() का संदर्भ देता है जो आपके वास्तविक एप्लिकेशन का संदर्भ देता है। इसका मतलब है कि इंस्ट्रुमेंटेशन # getTargetContext #() का उपयोग जोखिम भरा है क्योंकि आपके परीक्षण उन फ़ाइलों को संशोधित कर सकते हैं जो वास्तव में आपके एप्लिकेशन द्वारा उपयोग किए जाते हैं। –

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