Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

在Android中使用数据库,在一些情况下,需要导进一个已经有数据的数据库,然后在程序中去调用它,来实现我们的功能。

比如在一个查询信用卡归属银行的小demo中,在输入框输入信用卡的前6位号码(这6位号码决定了信用卡的归属银行),点击查询按钮,就可以将其对应的银行给显示出来。

Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

而卡表中的数据结构如下:

Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

下面我们来看看,程序中是如何实现这个功能的。

1)Asset文件夹

在Asset文件夹下面放上我们的数据库:

Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

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/"下面,并创建对应的文件,如下:

Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

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

Android学习小Demo(16)Android中使用已存在数据的SqliteDatabase

上一篇:小程序中的请求封装


下一篇:Android Studio使用iOS模拟器运行Flutter项目