如何将数据库从资源文件夹复制到数据库文件夹

我的代码如下:

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; }} 

如何从我的资产文件夹中移动现有数据库并将其用作位于我的应用程序沙箱中的本机数据库? 任何帮助都非常感谢。

像下面的代码一样修改DatabaseHandler createDataBase()方法:

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的Construct中初始化它,如下所示: DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
DB_NAME = YOUR_DATABASE_NAME_THAT_IS_STORED_IN_YOUR_ASSETS_FOLDER

我希望这有帮助。

PS:DB_NAME和DB_PATH都是字符串。

更新:
每当您尝试使用DatabaseHelper类的实例时,只需像这样调用此方法createDatabase()

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

如果数据库尚未复制到Databases目录,它将从Asset Folder复制现有数据库。
我希望这有帮助。