为了方便查看,添加了导出导入数据的功能,默认导出格式为".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();
}
}
项目地址: 玩转数据统计