2013-12-15 130 views
2

我的代碼如下:
如何從資源文件夾數據庫複製到數據庫文件夾

dbhelper.java

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion >= newVersion) return; 
    db.execSQL("DROP DATABASE IF EXISTS " + DATABASE_NAME +";"); 
    onCreate(db); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 

    //here is the database definition 
    db.execSQL("CREATE TABLE dhivehienglish " + 
      "(mv TEXT, en TEXT);"); 
    //insert pre-configured records 
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ކާރު','car');"); 
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ޖަހާ','hit');"); 
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('އިނުން','sit');"); 
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ކެއުން','eat');"); 
} 

}

MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_carian_kamus); 

    //listing data processes 
    //-initiate the database connector 
    db = dbhelper.getReadableDatabase(); 

    txtmelayu=(EditText)findViewById(R.id.txtmelayu); 
    btncari=(Button)findViewById(R.id.btncari); 
    btncari.setOnClickListener(this); 
    lblmakna=(TextView)findViewById(R.id.lblmakna); 

}//end onCreate 

public void onClick(View v){ 
    //fetch kata melayu dr textbox 
    String carimelayu=txtmelayu.getText().toString(); 
    //kena letak dalam onclick 
    //-run SELECT command to fetch data from table 
    if (v.getId()==R.id.btncari){ 
     Cursor cmelayu=db.rawQuery("SELECT * FROM dhivehienglish " + 
       "WHERE mv='"+carimelayu+"';", null); 
     //-fetch record 
     if(cmelayu.getCount()!=0){ 
      cmelayu.moveToFirst();//go to first row 
      String en=cmelayu.getString(1).toString(); 
      lblmakna.setText(en); 
     } 
     else{ 
      //display some notice here saying no data found 
      lblmakna.setText("Not found!");}} 

}//end onCLick 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_carian_kamus, menu); 
    return true; 
} 

//when menu is selected 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    //call about screen, if user hit "Tentang kami" menu 
    if (item.getItemId()==R.id.minsert){ 
     Intent ins= new Intent (this, InsertActivity.class); 
     startActivity(ins); 
    } 
    return true; 
}} 

如何我可以從我的資產文件夾中移動現有的數據庫,並將其用作位於本地的數據庫在我的應用程序的沙箱中?任何幫助,高度讚賞。

+0

請檢查下面的答案,如果它解決了您的問題,那麼請接受它。 –

+0

沒有顯示某種錯誤..數據庫沒有複製..可能是我錯誤地實現你的代碼。你可以簡單地幫助我如何把你的代碼放在dbhelper.java中 – Aroo

+0

請檢查更新後的答案,謝謝。 –

回答

1

修改您的createDataBase()方法在DatabaseHandler像下面的代碼:

的CreateDatabase():

public void createDataBase() throws IOException 
{ 
    //If database not exists copy it from the assets 

    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist) 
    { 
     this.getReadableDatabase(); 
     this.close(); 
     try 
     { 
      //Copy the database from assests 
      copyDataBase(); 
      System.out.println("createDatabase database created"); 
     } 
     catch (IOException mIOException) 
     { 
      throw new Error("ErrorCopyingDataBase"); 
     } 
    } 
} 

checkDataBase():

private boolean checkDataBase() 
{ 
    File dbFile = new File(DB_PATH + DB_NAME); 
    //Log.v("dbFile", dbFile + " "+ dbFile.exists()); 
    return dbFile.exists(); 
} 

copyDataBase( ):

//Copy the database from assets 
private void copyDataBase() throws IOException 
{ 
    InputStream mInput = mContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 

    OutputStream mOutput = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
     mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
} 

其中DB_PATH = /data/data/YOUR_PACKAGE_NAME/Databases/,您可以初始化它在你的DatabseHandler的構造是這樣的:DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
DB_NAME = YOUR_DATABASE_NAME_THAT_IS_STORED_IN_YOUR_ASSETS_FOLDER

我希望這有助於。

P.S:DB_NAME和DB_PATH都是字符串。

UPDATE:
每當你要使用你的DatabaseHelper類的實例,只需調用這個方法createDatabase()這樣的:

DatabaseHandler db = new DatabaseHandler(context); 
    try 
    { 
     db.createDataBase(); 
    } 
    catch (IOException io) 
    { 
     throw new Error("Unable to create database"); 
    } 

將現有數據庫從資產文件夾,如果數據庫副本尚未被複制到數據庫目錄。
我希望這有助於。

相關問題