在Android中使用数据库,在一些情况下,需要导进一个已经有数据的数据库,然后在程序中去调用它,来实现我们的功能。
比如在一个查询信用卡归属银行的小demo中,在输入框输入信用卡的前6位号码(这6位号码决定了信用卡的归属银行),点击查询按钮,就可以将其对应的银行给显示出来。
而卡表中的数据结构如下:
下面我们来看看,程序中是如何实现这个功能的。
1)Asset文件夹
在Asset文件夹下面放上我们的数据库:
2)创建一个CreditCardDb类。
在这个类中,我们要实现以下几个功能:
2.1)要将数据库从assets 文件夹复制到手机自身的存储当中去,即/data/data/package/databases/。
public void copyDatabase(){
String databasePath = mContext.getApplicationContext().getFilesDir().getAbsolutePath();
databasePath = databasePath.substring(0, databasePath.lastIndexOf("/")) + "/databases";
mDatabasePath = databasePath + "/" + DB_NAME;
File dir = new File(databasePath);
if(!dir.exists()){
dir.mkdir();
}
File file = new File(mDatabasePath);
if(!file.exists() || file.length() == 0){
try {
InputStream is = mContext.getAssets().open("database/"+DB_NAME);
FileOutputStream fos = new FileOutputStream(mDatabasePath);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面这个方法中,
a)首先找出数据库在内存中存放的位置,即"/data/data/包名/databases/"下面,并创建对应的文件,如下:
b)利用Context类的getAssets方法获得AssetManager,然后调用其open方法,将对应路径下的数据库打开,并写到上一步找出来的文件中去。
2.2)创建两个方法,一个用来打开数据库,一个用来关闭数据库,如下:
private void openDatabase(){
Log.v(TAG, "Open DataBase : " + mDatabasePath);
mCreditCardDb = SQLiteDatabase.openDatabase(mDatabasePath, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
private void closeDatabase() {
SQLiteDatabase.releaseMemory();
mCreditCardDb.close();
}
2.3)剩下的就是对数据库表的操作了,根据前6位卡号查出所属的银行:
public String getBankByCreditCardNumber(String creditCardNumber){
String sql = "select * from t_bank where card_bin = ? ";
String bankName = "";
openDatabase();
Cursor cursor = mCreditCardDb.rawQuery(sql, new String[] {creditCardNumber});
if(cursor == null){
Log.e(TAG, "Cursor is null.");
}else if(!cursor.moveToFirst()){
Log.e(TAG, "Cursor has no records.");
}else{
bankName = cursor.getString(cursor.getColumnIndex(COL_BANK_NAME));
}
closeDatabase();
return bankName;
}
3)MainActivity
在MainActivity的onCreate方法中,构造CreditCardDb类的对象,并调用其copyDatabase方法,如下:
mCreditCardDb = new CreditCardDb(this);
mCreditCardDb.copyDatabase();
并创建一个AsyncTask,根据EditText输入的值,去数据库中查询,将查询的结果展示在TextView上,如下:
class CheckCreditCard extends AsyncTask<String, Void, String>{
protected void onPostExecute(String result){
tvBankName.setText(result);
}
@Override
protected String doInBackground(String... params) {
String creditCardNumber = params[0];
String bankName = "";
if(creditCardNumber.length() >= 6){
bankName = mCreditCardDb.getBankByCreditCardNumber(creditCardNumber.substring(0,6));
}
return bankName;
}
}
这里只是简单地展示如何去使用已存在数据的数据库, 源代码下载。
结束!