我的代码如下:
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 :(得分:2)
修改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都是字符串。
更新:
每当您尝试使用DatabaseHelper
类的实例时,只需像这样调用此方法createDatabase()
:
DatabaseHandler db = new DatabaseHandler(context);
try
{
db.createDataBase();
}
catch (IOException io)
{
throw new Error("Unable to create database");
}
如果数据库尚未复制到Databases目录,它将从Asset Folder复制现有数据库 我希望这会有所帮助。