分词统计(三)导入导出数据

本文介绍了一个安卓应用程序中实现的数据导出和导入功能,包括CSV文件的生成与读取、数据库操作及用户交互界面的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了方便查看,添加了导出导入数据的功能,默认导出格式为".csv",位置位于SDCard的"DownLoad"目录下。

效果图:



文件操作代码

package com.mwf.analyze.utils;

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;

import com.mwf.analyze.bean.AnalyzeBean;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * 文件管理工具
 */
public class FileUtils {

    /**
     * 读取txt文件的内容
     */
    public static String readTxtFile(String filePath) {
        try {
            String encoding = "GBK";
//            String encoding="UTF-8";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) { //判断文件是否存在
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file), encoding);//考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                String result = "";
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    if (!TextUtils.isEmpty(lineTxt)) {
                        System.out.println(lineTxt);
                        result += lineTxt;
                    }
                }
                read.close();
                return result;
            } else {
                System.out.println("找不到指定的文件");
                return null;
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 导出csv文件
     */
    public static boolean saveTxt(String content, Context context, String path, String fileFullName) {
        //sd卡检测
        String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
//            Toast.makeText(context, "SD 卡不可用", Toast.LENGTH_SHORT).show();
            return false;
        }
        //检测文件夹是否存在
        File file = new File(path);
        file.exists();
        file.mkdirs();
        String p = path + File.separator + fileFullName;
        FileOutputStream outputStream = null;
        try {
            //创建文件,并写入内容
            outputStream = new FileOutputStream(new File(p));
            String msg = new String(content);
            outputStream.write(msg.getBytes("GBK"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
//                Toast.makeText(context, "导出成功", Toast.LENGTH_SHORT).show();
            }
        }
        return true;
    }

    /**
     * 导入csv文件
     */
    public static List<AnalyzeBean> readCSV(String csvPath) {
        File csvFile = new File(csvPath);
        List<AnalyzeBean> mList = new ArrayList<AnalyzeBean>();
        AnalyzeBean newBean;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), "GBK"));
            String line = "";
            while ((line = br.readLine()) != null) {
                // 把一行数据分割成多个字段
                StringTokenizer st = new StringTokenizer(line, "|");
                while (st.hasMoreTokens()) {
                    String str = st.nextToken();
                    String[] result = str.split(",");
                    newBean = new AnalyzeBean();
                    newBean.setAmount(Integer.valueOf(result[0]));
                    newBean.setName(result[1]);
                    mList.add(newBean);
//                    System.out.println("tokens_____" + str);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mList;
    }
}


导出功能代码,先读取数据库数据,然后开启一个子线程

  /**
     * 导出完成更新UI
     */
    private final Handler exportFnishHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            dismissProgress();
            Toast.makeText(AnalyzePoemActivity.this, "导出成功", Toast.LENGTH_SHORT).show();
        }
    };

  

    /**
     * 导出数据
     */
    private void export() {
        //查询所有数据
        AnalyzeDao dao = new AnalyzeDao(AnalyzePoemActivity.this);
        final List<AnalyzeBean> list = dao.queryAll();

        if (list == null || list.size() == 0) {
            Toast.makeText(this, "查询不到数据", Toast.LENGTH_LONG).show();
            return;
        }

        //显示一个输入导出的文件名的对话框
        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.dialog_export, null);
        final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setCancelable(true);
        alertDialog.show();
        alertDialog.setContentView(view);
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        alertDialog.getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        final EditText editText = (EditText) view.findViewById(R.id.editText);

        Button btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
        btn_cancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
            }
        });

        Button btn_commit = (Button) view.findViewById(R.id.btn_commit);
        btn_commit.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
                showProgress("正在导出,请稍后......");

                String name = editText.getText().toString();
                Log.e(TAG, "name=" + name);
                if (TextUtils.isEmpty(name)) {
                    name = editText.getHint().toString();
                    name = name.substring(5, name.length());
                }

                final String finalName = name;

                //获取SDCard路径
                final File file = Environment.getExternalStorageDirectory();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String text = "";
                        for (int i = 0; i < list.size(); i++) {
                            text += (list.get(i).getAmount() + "," + list.get(i).getName() + "\n");
                        }
                        //保存文件
                        FileUtils.saveTxt(text, AnalyzePoemActivity.this, file.getAbsolutePath() + File.separator + "Download", finalName + ".csv");
                        exportFinishHandler.sendEmptyMessage(0);
                    }
                }).start();

            }
        });

    }

导出数据库查询代码

    /**
     * 查询所有数据
     */
    public List<AnalyzeBean> queryAll() {
        List<AnalyzeBean> list = null;
        try {
            //根据数量降序查询
            list = daoOpe.queryBuilder().orderBy("amount", false).query();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

对话框布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:gravity="center_horizontal"
        android:text="请输入文件名称"
        android:textColor="#000000"
        android:textSize="12dp"/>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:editable="true"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:hint="默认名字:我的统计表数据"
        android:textSize="15dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="30dp"
            android:text="取消"/>
        <Button
            android:id="@+id/btn_commit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="30dp"
            android:text="确认"/>
    </LinearLayout>

</LinearLayout>

导入代码

 /**
     * 导入数据完成UI更新
     */
    private final Handler inportFinishUIHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            dismissProgress();
            Toast.makeText(AnalyzePoemActivity.this, "导入成功", Toast.LENGTH_SHORT).show();
            //展示数据
            showData();
        }
    };

    /**
     * 导入数据
     */
    private void inport() {
        DialogSelectionListener listener = new DialogSelectionListener() {
            @Override
            public void onSelectedFilePaths(final String[] files) {
                if (files != null && files.length >= 0) {
                    
                    showProgress("正在导入,请稍后......");
                    
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //读取文件
                            List<AnalyzeBean> list = FileUtils.readCSV(files[0]);
                            
                            AnalyzeDao dao = new AnalyzeDao(AnalyzePoemActivity.this);
                            //逐个检查合并数据
                            for (int i = 0; i < list.size(); i++) {
                                dao.merge(list.get(i));
                            }
                            
                            Log.e(TAG, "导入完毕");
                            inportFinishUIHandler.sendEmptyMessage(0);
                        }
                    }).start();

                }
            }
        };
        openFile(listener);

    }

数据库操作

    /**
     * 检查是否已经存在
     * 有则数量想加
     * 没有则新增一个
     */
    public void merge(AnalyzeBean mBean) {
        AnalyzeBean sqlBean = null;
        try {
            sqlBean = daoOpe.queryBuilder().orderBy("id", false).where().eq("name", mBean.getName()).queryForFirst();
            if (sqlBean == null) {
                //新建一个
                daoOpe.create(mBean);
            } else {
                //数量相加
                sqlBean.setAmount((sqlBean.getAmount() + mBean.getAmount()));
                daoOpe.update(sqlBean);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

清空数据代码

 /**
     * 清空数据结束更新UI
     */
    private final Handler clearFinishUIHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            dismissProgress();
        }
    };

    /**
     * 清空数据
     */
    private void clear() {
        showProgress("正在清空,请稍后......");
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                //清空数据库
                new AnalyzeDao(AnalyzePoemActivity.this).deletedAll();
                Log.e(TAG, "清空完毕");
                clearFinishUIHandler.sendEmptyMessage(0);
            }
        }).start();
        //清空内容
        mTxtContent.setText("");
    }

清空数据数据库操作,先读取全部,再遍历删除

    /**
     * 删除所有数据
     */
    public void deletedAll() {
        try {
            List<AnalyzeBean> list = queryAll();
            Log.e(TAG, "删除总数: " + list.size());
            
            //遍历逐个删除
            for (int i = 0; i < list.size(); i++) {
                daoOpe.delete(list.get(i));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

项目地址: 玩转数据统计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值