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;
}
-
获取数据库内容并赋值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();
}
}