在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; } }
这里只是简单地展示如何去使用已存在数据的数据库,源代码下载。
结束!
Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase,布布扣,bubuko.com