android应用程序和数据库文件绑定

在有的时候,应用程序需要绑定一些数据库文件一起发布,毕竟不可能都从服务器读取或用户输入。解决方法之一把数据库文件放在res/raw下,然后一运行程序就判断是否存在数据库表不存在则通过输入输出流复制raw下的数据库文件到手机中.代码如下

package com.ts.first;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;

public class MainActivity extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/*
		 * (/data/data/...)这种不被推荐,eclipse会警告你的,
		 * 我是这么得到数据库路径的,但是我这么得到的是/data/data/com
		 * .ts.first/databases/sqlite.db,所以要进行修改)
		 */
		String DB_PATH = getDatabasePath("sqlite.db").toString();
		String DB_Dir = DB_PATH.substring(0, DB_PATH.lastIndexOf("/")) + "/";
		// 最后得到的是/data/data/com.ts.first/databases/,这正是我们所需要的
		String[] path = { DB_PATH, DB_Dir };
		// 如果数据库不存在,执行异步任务创建之
		if (!isDataBaseExist(DB_PATH)) {
			FirstAsyncTask firstAsyncTask = new FirstAsyncTask();
			firstAsyncTask.execute(path);
		}
	}

	// 在这里使用使用异步操作去将文件复制到/data/data/com.ts.first/databases/,就达到了我们的目的
	public class FirstAsyncTask extends AsyncTask<String, Void, Void> {

		protected Void doInBackground(String... path) {
			File file = new File(path[1]);
			// 如果文件不存在,创建之
			if (!file.exists()) {
				file.mkdir();
			}
			FileOutputStream os = null;
			try {
				os = new FileOutputStream(path[0]);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			// 得到数据库文件的写入流
			InputStream is = MainActivity.this.getResources().openRawResource(
					R.raw.sqlite);
			// 得到数据库文件的数据流
			byte[] buffer = new byte[8192];
			int count = 0;
			try {
				while ((count = is.read(buffer)) > 0) {
					os.write(buffer, 0, count);
					os.flush();
				}
				is.close();
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}

	}

	// 判断数据库是否存在
	public boolean isDataBaseExist(String path) {
		SQLiteDatabase sqLiteDatabase = null;
		try {
			/*
			 * 以只读方式打开数据库。在不知道磁盘已满是否已满的情况下,这是唯一可靠的方式来打开数据库。(官方API是这样描述的 )
			 */sqLiteDatabase = SQLiteDatabase.openDatabase(path, null,
					SQLiteDatabase.OPEN_READONLY);
		} catch (Exception e) {
		}
		if (sqLiteDatabase != null)
			sqLiteDatabase.close();
		return sqLiteDatabase != null ? true : false;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值