Android 根据csv文件批量生成创建数据库表语句

 使用场景:自动将某个路径下的所有csv文件在数据库中自动创建对应的表,并且将文件中的数据自动导入到数据库中。

本文使用sqlite原生语句添加

本文使用了blankj的方法,不得不说这个确实很方便:

地址:mirrors / Blankj / AndroidUtilCode · GitCode

1、首先是获取文件夹下所有csv的文件,并且过滤不需要的文件,返回文件名列表,返回的文件名包括.csv

/**
 * 获取Archives文件夹下所有csv结尾的文件名
 * @return  List<String> 
 */
public static List<String> getAllArchiveName(){
    List<String> fileName = new ArrayList<>();
    List<File> filelist = FileUtils.listFilesInDir(new File(ConstantConfig.AppArchivePath));

    Log.i(TAG,"creatDbTab filelist:"+filelist.size());
    for (int i=0;i<filelist.size();i++){
        //判断是不是other文件
        if (filelist.get(i).getName().toLowerCase().contains("other")){
            Log.i("getAllArchiveName","检测到other文件,不进行处理"+filelist.get(i).getName());// 输出一行数据
        }else{
            if (filelist.get(i).getName().contains(".csv")){
                fileName.add(filelist.get(i).getName());
            }
        }

    }
    return fileName;
}

2、由于csv文件第一行是由逗号隔开的字段名,所以可以通过传入一个文件路径,将第一行的字段名存入list与截取出来的文件名作为表名一起返回

 public static Pair<String,List<String>>  creatWtsSqlFile(String filePath){
        Log.i(TAG,"creatWtsSqlField filePath:"+filePath);
        Pair<String, List<String>> sqlpair = null;
        //判断文件是否存在
        if (!FileUtils.isFileExists(filePath)){
            return null;
        }
        //使用文件名作为表名
        String fileName = filePathToName(filePath);
        try {
            File wts = new File(filePath);
            InputStreamReader isr = new InputStreamReader(new FileInputStream(wts), "GBK");
            BufferedReader br = new BufferedReader(isr);
            String first =  br.readLine();
            String buffer[] = first.split(  ",");// 以逗号分隔
            List<String> resultList = new ArrayList<>(buffer.length);
            Collections.addAll(resultList,buffer);
            sqlpair = new Pair<>(fileName.replace(".wts","").toLowerCase(), resultList);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  sqlpair;
    }

3、下面将上面两个方法返回的内容,进行处理,组合成创建数据库表的sql语句,并传入数据库操作方法中。

  /**
     * 根据所有档案创建数据库表结构
     */
    public void creatDbTab() {
        ArrayList<String> creatSqlList = new ArrayList<>();
        List<Pair<String, List<String>>> TabNamePairList = new ArrayList<>();
        List<String> fileNameList = ArchivesUtils.getAllArchiveName();
        //将目录下所有文件的表名与字段名放入list中
        for (String fileName : fileNameList) {
            Pair<String, List<String>> sqlpair = ArchivesUtils.creatWtsSqlFile(ConstantConfig.AppArchivePath + fileName, myDBHelper);
            if (null!=sqlpair){
                TabNamePairList.add(sqlpair);
            }
        }
        Log.i("initCreatSql", "TabNamePairList.size:  " + TabNamePairList.size());

        try {
            //循环list,将不同文件的文件名与字段名组合成创建表的sql,然后传入数据库操作方法中
            for (Pair<String, List<String>> tabPair : TabNamePairList) {
                if (null!=tabPair&&null!=tabPair.first&&null!=tabPair.second){
                    String creatSql = "CREATE TABLE " + tabPair.first + "(" +
                            " id integer primary key autoincrement";
                    for (int i = 0; i < tabPair.second.size(); i++) {
                            creatSql = creatSql + ",'" + tabPair.second.get(i) + "'  TEXT";
                    }
                    creatSql = creatSql + ")";
                    creatSqlList.add(creatSql);
                    Log.i("initCreatSql", "creatSql:  " + creatSql);
                    //将sql语句传入数据库操作类中运行
                    creatTable(creatSql);
                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
            Log.e("initCreatSql", "SQLException:  " + e.toString());
        } finally {
        }

    }

以上就是获取csv文件的数据自动创建数据库表的实现,在得到sql语句之后就比较自由了,可以使用android原生的sqlite运行语句,也可以使用一些三方的框架运行,我这边使用的是 greendao,如果用原生还需要处理多线程并发的问题比较麻烦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值