android数据库导入读取.db文件内容

test.db
1.将test.db文件放入app目录下assets文件下

2.在需要读取数据库的act或fragment,中

		SQLiteDatabase myDatabase;
		List<Test> list = new ArrayList<>();


		  String data  =   getDatabasePath("test.db").toString();
		 myDatabase = SQLiteDatabase.openDatabase(data,null,SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING);
		list = getTest();

3.读取myDatabase 内容,
1. 新建与数据库对应的Bean

			public class Test{
	    public int x1;
	    public String x2;
	    public String x3;
	    //    public String fo;
	    public String x4;
	    public String x5;
	    public String x6;
	    public int x7;
		//    public String mp;
		}
  1. 获取数据库内容并赋值list

    public List<Test> getTest(){
    	List<Test> list=new ArrayList<>();
     Cursor cursor = myDatabase.query("表名",null,null,null,null,null,null); //表名-为当前数据表名
     //也可以使用Cursor对象的rawQuery方法,使用sql指定的数据
    //Cursor cursor = myDatabase.rawQuery("select * from userInfo",null);
    	if(cursor.getCount()>0){
        cursor.moveToFirst();//将cursor移动到第一个光标上
        int count=cursor.getCount();
        //将cursor中的每一条记录生成一个question对象,并将该question对象添加到list中
        for(int i=0;i<count;i++){
            cursor.moveToPosition(i);
            Test users =new Test();
            users.x1=cursor.getInt(cursor.getColumnIndex("id")); //对应数据库内的各项参数名
            users.x2=cursor.getString(cursor.getColumnIndex("idiom"));
            users.x3=cursor.getString(cursor.getColumnIndex("standingInitial"));
          //   users.xxx= cursor.getString(cursor.getColumnIndex("文件"));
            users.x4=cursor.getString(cursor.getColumnIndex("pronounce"));
            users.x5=cursor.getString(cursor.getColumnIndex("explain"));
            users.x6=cursor.getString(cursor.getColumnIndex("provenance"));
            users.x7=cursor.getInt(cursor.getColumnIndex("level"));
    
            list.add(users);//添加
        }
        }
        return list;
        }
    

忘了加初始化复制的代码了,现在补上:

在初始化的地方加上这个方法,需要请求存取权限,只需要初始化复制一次即可添加db的数据进数据库。后续调用如上

	private void getSqlData(){
    List<String> permissions = new ArrayList<>();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        permissions.add(Permission.MANAGE_EXTERNAL_STORAGE);
    } else {
        permissions.add(Permission.READ_EXTERNAL_STORAGE);
        permissions.add(Permission.WRITE_EXTERNAL_STORAGE);
    }
    String msg = "此功能需要存储权限";
    PermissionUtil.hasPermissions(requireContext(), permissions, msg, () -> {
        MyDataHelper Helper = new MyDataHelper(requireActivity());
        try {
            Helper.CopyDBFile(); //拷贝
        } catch (IOException e) {
            e.printStackTrace();
        }
        startActivity(new Intent(requireActivity(), xxx.class));
    });


}

MyDataHelper的代码:

public class MyDataHelper{

//导入的sqlite数据库文件名
private final String DB_NAME = "test.db";
private SQLiteDatabase myDatabase;
private Context context;

//定义类的方法
public MyDataHelper(Context context) {
    this.context = context;
}





// 复制和加载区域数据库中的数据
public String CopyDBFile() throws IOException {

    // 在第一次运行应用程序时,加载数据库到data/data/当前包的名称/database/数据库名字
    //获取准确的路径,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);
            }
//                Log.e("CZH","写入完成");

        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            //关闭资源
            if (outputStream != null) {

                outputStream.flush();
                outputStream.close();

            }
            if (inputStream != null) {
                inputStream.close();
            }

        }

    }

    return file.getPath();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值