在做Android应用的时候,不可避免要用到数据库。但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的。
这就造成了一个问题,这个问题其实很好解决,解决方法如下:
我们首先把有数据的数据库文件放在assets资源目录下边,然后在apk应用启动的时候,把assets目录下的数据库文件的数据写入到真机的内存中去。
将数据库导入
public class AreaSq {
// 注意:路径要写自己的包名
// 数据库存储路径
String filePath = "data/data/com.zhangyun.cordbloodbank/area.db";
// 数据库存放的文件夹 data/data/com.main.jh 下面
String pathStr = "data/data/com.zhangyun.cordbloodbank";
SQLiteDatabase database;
public SQLiteDatabase openDatabase(Context context) {
File jhPath = new File(filePath);
// 查看数据库文件是否存在
if (jhPath.exists()) {
// 存在则直接返回打开的数据库
// Log.e("kk","存在");
return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
} else {
// Log.e("kk","不存在");
File path = new File(pathStr);
if (path.mkdir()) {
// Log.e("kk","创建成功");
} else {
// Log.e("kk","创建失败");
}
;
try {
// 得到资源
AssetManager am = context.getAssets();
// 得到数据库的输入流
InputStream is = am.open("area.db");
// Log.i("test", is+"");
// 用输出流写到SDcard上面
FileOutputStream fos = new FileOutputStream(jhPath);
// Log.i("test", "fos="+fos);
// Log.i("test", "jhPath="+jhPath);
// 创建byte数组 用于1KB写一次
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) > 0) {
// Log.i("test", "得到");
fos.write(buffer, 0, count);
}
// 最后关闭就可以了
fos.flush();
fos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
// 如果没有这个数据库 我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了
return openDatabase(context);
}
}
读取
“`
//打开数据库输出流
SQLdm s = new SQLdm();
SQLiteDatabase db =s.openDatabase(getApplicationContext());
//查询数据库中testid=1的数据
Cursor cursor = db.rawQuery("select * from testbiao where testid=?", new String[]{"1"}