Android studio需要将assets目录建在main项目下。即和Java,res等文件夹是同级的,数据库文件放在assets目录下。
这里说一下网上有的说res下raw目录,这里说一下区别:
assets:不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会打入程序安装包中
raw:会在R.java文件下生成标记,这里的资源会在运行打包操作的时候判断哪些被使用到了,没有被使用到的文件资源是不会打包到安装包中的
res/raw和assets文件夹来存放不需要系统编译成二进制的文件。
具体步骤
在main目录下创建assets目录,把.db文件复制到文件夹下(android studio在project下就可以找到main目录)
第二部要把文件复制到手机上,这里用IO实现
public class DBFile {
//数据库文件名
private final String DB_NAME = "fileName.db";
private Context context;
public DBFile(Context context) {
this.context = context;
}
// 复制和加载区域数据库中的数据
public String CopyDBFile() throws IOException {
// 第一次运行应用程序时,加载数据库到data/data/当前包的名称/database/<db_name>
//获取准确的路径,context.getPackageName()得到包名
File dir = new File("data/data/" + context.getPackageName() + "/databases");
//如果文件夹不存在创建文件
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdir();
}
//声明文件
File file = new File(dir, DB_NAME);
//输入流
InputStream inputStream = null;
//输出流
OutputStream outputStream = null;
//如果不存在,通过IO流的方式,将assets目录下的数据库文件,写入到手机中。
if (!file.exists()) {
try {
//创建文件
file.createNewFile();
//通过路径加载文件
inputStream = context.getClass().getClassLoader().getResourceAsStream("assets/" + DB_NAME);
//输出到文件
outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len;
//按字节写入
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
}
}
return file.getPath();
}
在初始界面onCreate里加入以下两句
DBFile dbFile = new DBFile(WelcomeActivity.this);
dbFile.CopyDBFile();
这里就大功告成了,运行程序,查看虚拟机内部文件在 data/data/项目包路径/databases
刷新一下就可以看到 .db
文件了。
使用方法
private void initView() {
//获取路径
String databases_path = getDatabasePath("poetry.db").toString();
//代开数据库
SQLiteDatabase database = SQLiteDatabase.openDatabase(databases_path, null, SQLiteDatabase.OPEN_READONLY);
//sql语句
String sql = "select * from collection_kinds where name like ?";
//条件
String[] str = {"%节%"};
//执行查询
SQLiteCursor cursor = (SQLiteCursor) database.rawQuery(sql, str);
//移到第一位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
//获取路径
System.out.println(cursor.getInt(0) + " " + cursor.getString(1));
//移动到下一位
cursor.moveToNext();
}
}
大功告成!!!