2011-01-22 12 views
5

नहीं खोल सकता मैं SQL के साथ एक साधारण एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं। मैंने निम्नलिखित मार्गदर्शिकाओं का पालन किया - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/डेटाबेस-एंड्रॉइड

डेटाबेस खोलने का प्रयास करते समय मुझे एक त्रुटि मिलती है। यहाँ मेरी DataBaseHelp.Java कक्षा

public class DataBaseHelper extends SQLiteOpenHelper{ 

private static String DB_PATH = "/data/data/and.testDB/databases/"; 

private static String DB_NAME = "MyData"; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 
public DataBaseHelper(Context context) { 

super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 
public void createDataBase() throws IOException{ 

boolean dbExist = checkDataBase(); 

if(dbExist){ 
    //do nothing - database already exist 
}else{ 
    this.getReadableDatabase(); 

    try { 

    copyDataBase(); 

    } catch (IOException e) { 

     throw new Error("Error copying database"); 

    } 
} 

} 

private boolean checkDataBase(){ 

SQLiteDatabase checkDB = null; 

try{ 
    String myPath = DB_PATH + DB_NAME; 
    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

}catch(SQLiteException e){ 

    //database does't exist yet. 

} 

if(checkDB != null){ 

    checkDB.close(); 

} 

return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException{ 

//Open your local db as the input stream 
InputStream myInput = myContext.getAssets().open(DB_NAME); 

// Path to the just created empty db 
String outFileName = DB_PATH + DB_NAME; 

//Open the empty db as the output stream 
OutputStream myOutput = new FileOutputStream(outFileName); 

//transfer bytes from the inputfile to the outputfile 
byte[] buffer = new byte[1024]; 
int length; 
while ((length = myInput.read(buffer))>0){ 
    myOutput.write(buffer, 0, length); 
} 

//Close the streams 
myOutput.flush(); 
myOutput.close(); 
myInput.close(); 

} 

public void openDataBase() { 

//Open the database 
    String myPath = DB_PATH + DB_NAME; 
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
} 
@Override 
public synchronized void close() { 
     if(myDataBase != null) 
      myDataBase.close(); 
     super.close(); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

है और ये मेरे testDB.Java कक्षा

public class testDB extends Activity { 
SQLiteDatabase myDataBase; 
public String[] gur = new String[4]; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    DataBaseHelper myDbHelper = new DataBaseHelper(this); 
    myDbHelper = new DataBaseHelper(this); 

    try { 

     myDbHelper.createDataBase(); 

} catch (IOException ioe) { 

    throw new Error("Unable to create database"); 

} 

try { 

    myDbHelper.openDataBase(); 
// Here is the problem-Can't open the database/ 
}catch(SQLException sqle){ 

    throw sqle; 

} 
    myDataBase = myDbHelper.getWritableDatabase(); 

    Cursor c = myDataBase.rawQuery("SELECT * FROM beer", null); 


if (c != null) { 
    if (c.moveToFirst()) { 
      for(int x=0;x< 1;x++) 
      { 

       gur[x] = (c.getString(c.getColumnIndex("name"))); 
       c.moveToNext(); 
      } 
} 
    Toast.makeText(this,gur[0],Toast.LENGTH_LONG).show(); 
} 


     } 
    } 

मैं SQLite डेटाबेस ब्राउज़र का उपयोग कर डेटाबेस बनाया है, "बियर" नाम की एक तालिका बनाई, जोड़ा 2 पंक्तियों और इसे मेरे प्रोजेक्ट में/assests फ़ोल्डर में डाल दिया।

कृपया ध्यान दें कि मैं SQL में नया हूं, और इसका उपयोग करने वाला मेरा पहला समय है। मैंने पूरे दिन एक उत्तर के लिए खोज की और एक नहीं मिला।

धन्यवाद!

+0

http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with -android-app/9109728 # 9109728 –

उत्तर

1

आपको अपने डेटाबेस सहायक (SQLiteOpenHelper का विस्तार) के ऑनक्रेट विधि में डेटाबेस बनाने की आवश्यकता है। रीड करने योग्य डाटाबेस() प्राप्त करने के लिए आपका कॉल एप्लिकेशन के संदर्भ में डेटाबेस बनाए जाने तक कुछ भी वापस नहीं करेगा।

db.execSQL("CREATE TABLE " + TABLE_NAME 
+ " (_id INTEGER PRIMARY KEY AUTOINCREMENT," 
+ "foo TEXT, bar TEXT);"); 

उन पंक्तियों के साथ कुछ। स्पष्ट रूप से अपनी खुद की डेटा योजना भरें।

फिर आप अपने संपत्ति फ़ोल्डर में मौजूद डेटाबेस से डेटा पढ़ सकते हैं और SQLite कमांड का उपयोग कर डेटाबेस में डाल सकते हैं।

http://www.devx.com/wireless/Article/40842

+0

क्या मुझे डेटाबेस बनाने की आवश्यकता है, यहां तक ​​कि सोचा कि मेरे पास बाहरी (संपत्तियों में) है? मेरे पास copyDatabase() फ़ंक्शन ऐसा करने के लिए है। – Tofira

+0

createDataBase में आप getReadableDatabase() को कॉल करते हैं यदि डेटाबेस मौजूद नहीं है। वह कॉल पहले से डेटाबेस बनाने के बिना असफल हो जाएगा। – Lunchbox

+0

कॉलिंग getReadableDatabase() एक गलती थी, मैंने इसे हटा दिया। वैसे भी, copyDataBase() ने मेरे लिए संपत्तियों से डेटाबेस की प्रतिलिपि बनाई है। मैं नहीं देखता कि डेटाबेस बनाने में मदद मिलेगी। क्या आप कृपया समझा सकते हैं? – Tofira

0

मैं एक अन्य ट्यूटोरियल का उपयोग करने का सुझाव देते हैं:

यहाँ एक ट्यूटोरियल है कि मैं शुरू करने के लिए प्रयोग किया जाता है। उपकरणों के बाहर डेटाबेस बनाने के लिए "थोड़ा सा" वायर्ड होता है। मैंने इसे एक किताब से सीखा, लेकिन मुझे लगता है कि यह tutorial सही प्रक्रिया का उपयोग करता है।

संपादित करें: ठीक है, ट्यूटोरियल एक विशेष मामला

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

जिस विधि को मैं दिखाने जा रहा हूं वह आपको "संपत्ति" फ़ोल्डर से अपनी SQLite डेटाबेस फ़ाइल लेता है और आपके एप्लिकेशन के सिस्टम डेटाबेस पथ में प्रतिलिपि बनाता है ताकि SQLiteDatabase API इसे सामान्य रूप से खोल और एक्सेस कर सके।"Android_metadata" ("लोकेल

टेबल बनाएं:

3

निम्नलिखित SQL विवरण SQLite डेटाबेस ब्राउज़र में अपने डेटाबेस खोलें और एक नई तालिका" android_metadata "कहा जाता है जोड़ने के लिए,

आप निष्पादित कर सकते हैं यह करने के लिए ": जांच

सम्मिलित करें तालिका" android_metadata "मूल्यों ('en_US') android_metadata" पाठ डिफ़ॉल्ट 'en_US')

अब एक ही पंक्ति पाठ 'hi पर' के साथ में डालने "

फिर, अपने टेबल के प्राथमिक आईडी फ़ील्ड को "_id" में बदलना आवश्यक है ताकि एंड्रॉइड को पता चले कि आपके टेबल के आईडी फ़ील्ड को बाध्य करना है।

अब अपनी परियोजनाओं संपत्ति फ़ोल्डर में नए डेटाबेस फ़ाइल की प्रतिलिपि है, यह काम करेंगे .....