android 将SQLite数据库的表格导出为csv格式,并解析csv文件
在做android的开发的时候,将数据保存到SQLite数据库中,有时候会要将保存的这些数据导出成excel表格,这样更方便查看。通过查找资料,可以将数据库中的表格转化成
csv(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)这种以纯文本的模式保存表格。还是以以前写的一个模板来实现点击打开链接,这里就不放这个的代码了,直接说将表格转化成csv格式导出。
isi.java
package com.example.project_isi;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;public class ISIActivity extends Activity{private RelativeLayout rl;private RelativeLayout rl2;private int i = 0;private String[] question = {"1、入睡困难:","2、维持睡眠困难:","3、早醒:","4、您对目前的睡眠模式满意/不满意程度如何?:","5、您认为您的失眠在多大程度上影响了您的日常功能:","6、您的失眠问题影响了您的生活质量,您觉得在别人眼中你的失眠程度如何?","7、您对目前的睡眠问题的担心/痛苦程度:","您的得分:"};private Button resultbutton;private int j;private String buttontext;private int resulttext[] = new int[10];private RadioButton button01;private RadioButton button02;private RadioButton button03;private RadioButton button04;private RadioButton button05;private RadioGroup radioGroup;private TextView questiontext;private int score;private Button databutton;@Overrideprotected void onCreate(Bundle savedInstanceState) {this.requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.isi);questiontext = (TextView) findViewById(R.id.questiontitle);radioGroup = (RadioGroup) findViewById(R.id.radiogroup);button01 = (RadioButton) findViewById(R.id.button01);button02 = (RadioButton) findViewById(R.id.button02);button03 = (RadioButton) findViewById(R.id.button03);button04 = (RadioButton) findViewById(R.id.button04);button05 = (RadioButton) findViewById(R.id.button05);databutton = (Button) findViewById(R.id.databutton);rl = (RelativeLayout) findViewById(R.id.relativeLayout);rl2 = (RelativeLayout) findViewById(R.id.relativeLayout2);radioGroup.setOnCheckedChangeListener(new RadioGroupListener());rl.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View arg0, MotionEvent arg1) {rl.setVisibility(View.INVISIBLE);rl2.setVisibility(View.VISIBLE);return false;}});databutton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent();intent.setClass(ISIActivity.this, PatientInfoManage.class);startActivity(intent);}});final Button nextbutton = (Button) findViewById(R.id.nextbutton);nextbutton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//questiontext.setText(question[i]); //i ++;if(button01.isChecked()==false && button02.isChecked()==false && button03.isChecked()==false&& button04.isChecked()==false&& button05.isChecked()==false && i != 0){new AlertDialog.Builder(ISIActivity.this).setTitle("温馨提示").setMessage("您还没有选择任何一个选项!").setPositiveButton("确定", null).show();return;}else{questiontext.setText(question[i]); if(i < question.length +1){i++;}if(i == 1){radioGroup.setVisibility(View.VISIBLE);}//i++;radioGroup.clearCheck();}score += j;System.out.println("result----->" + score);resulttext[i]= j;System.out.println("选择的结果----》" + resulttext[i]);//PInformation();//question[7] = "您的得分: " + score;if(i == question.length - 1){nextbutton.setText("确定");//score += j;int total = score +j;question[7] = "您的得分: " + total;System.out.println("您的得分---" + total);//PInformation();//finish();}if(i == question.length ){//finish();PInformation();radioGroup.setVisibility(View.INVISIBLE);nextbutton.setVisibility(View.INVISIBLE);}}});}public class RadioGroupListener implements OnCheckedChangeListener{@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {if(checkedId == button01.getId()){j = 0;buttontext = button01.getText().toString();System.out.println("buttontext ---" + buttontext);}if(checkedId == button02.getId()){j = 1;System.out.println("result11----->" + j);buttontext = button02.getText().toString();System.out.println("buttontext ---" + buttontext);}if(checkedId == button03.getId()){j = 2;buttontext = button03.getText().toString();System.out.println("buttontext ---" + buttontext);}if(checkedId == button04.getId()){j = 3;buttontext = button04.getText().toString();System.out.println("buttontext ---" + buttontext);}if(checkedId == button05.getId()){j = 4;buttontext = button05.getText().toString();System.out.println("buttontext ---" + buttontext);}}}//获得要保存的数据public void PInformation(){int[] result = new int[8];result[0] = resulttext[2];result[1] = resulttext[3];result[2] = resulttext[4];result[3] = resulttext[5];result[4] = resulttext[6];result[5] = resulttext[7];result[6] = resulttext[8];result[7] = score;String isi = "";for(int i = 0;i < result.length;i++){isi += String.valueOf(result[i]);}System.out.println("严重失眠指数----->" + isi);PatientTest patientTest = new PatientTest();patientTest.setIsi(isi);PatientTestDAO ptdao = new PatientTestDAO(ISIActivity.this);//获得最大的id//PatientInformationDAO pd = new PatientInformationDAO(ISIActivity.this);ptdao.insert(patientTest);System.out.println("当前ID----" + ptdao.getMaxId());Toast.makeText(ISIActivity.this, "【失眠程度评估】数据保存成功!", Toast.LENGTH_SHORT).show();////String test_table = null;Cursor c = ptdao.export();ExportToCSV(c, "test_table.csv");}//导出表格的方法public void ExportToCSV(Cursor c, String fileName) {int rowCount = 0;int colCount = 0;FileWriter fw;BufferedWriter bfw;//获取sd卡根目录File sdCardDir = Environment.getExternalStorageDirectory();//保存文件目录File saveFile = new File(sdCardDir, fileName);try {rowCount = c.getCount();colCount = c.getColumnCount();fw = new FileWriter(saveFile);bfw = new BufferedWriter(fw);if (rowCount > 0) {c.moveToFirst();// 写入表头for (int i = 0; i < colCount; i++) {if (i != colCount - 1)bfw.write(c.getColumnName(i) + ',');elsebfw.write(c.getColumnName(i));}// 写好表头后换行bfw.newLine();// 写入数据for (int i = 0; i < rowCount; i++) {c.moveToPosition(i);// Toast.makeText(mContext, "正在导出第"+(i+1)+"条",// Toast.LENGTH_SHORT).show();Log.v("导出数据", "正在导出第" + (i + 1) + "条");for (int j = 0; j < colCount; j++) {if (j != colCount - 1)bfw.write(c.getString(j) + ',');elsebfw.write(c.getString(j));}// 写好每条记录后换行bfw.newLine();}}// 将缓存数据写入文件bfw.flush();// 释放缓存bfw.close();// Toast.makeText(mContext, "导出完毕!", Toast.LENGTH_SHORT).show();Log.v("导出数据", "导出完毕!");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {c.close();}}}
上面有很多代码都是以前保存选项信息的代码,主要是最后一个方法实现格式的转化。
要在AndroidManifest.xml加上一句对文件的允许对sd卡可写
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最后得到的文件名为test_table.csv,用excel打开得到的表格如下:
数据完整的转化成了excel表格了。
然后是解析csv文件,这个没有布局文件,
Mainactivity.java,由于csv文件是用“,”分开的,在程序中就可以利用“,”将其分割开。
package com.example.testlistview;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.StringTokenizer;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;public class MainActivity extends Activity {//获得根目录路径File sdCardDir = Environment.getExternalStorageDirectory();int i = 0;int j = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try { File csv = new File(sdCardDir + "/test_table.csv"); // CSV文件BufferedReader br = new BufferedReader(new FileReader(csv));br.readLine();// 读取直到最后一行 String line = ""; //这一行不为空while ((line = br.readLine()) != null) { i++;//System.out.println("line---" + line);// 把一行数据分割成多个字段 StringTokenizer st = new StringTokenizer(line, ",");//遍历所有行,并打印出来,判断有没有分隔符while (st.hasMoreTokens()) { //j++;// 每一行的多个字段用TAB隔开表示 //s[i] = st.nextToken();System.out.print(st.nextToken()); // System.out.println("j ---" + j);} System.out.println();
// String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
//
// String last = item[item.length-1];//这就是你要的数据了
// j = item.length;
// System.out.println(last);} System.out.println("i----" + i);System.out.println("j----" + j);br.close();} catch (Exception e) { // 捕获File对象生成时的异常 e.printStackTrace(); }}
}
最后打印出来的数据为
:
这样数据就完整的转换过来了。
android 将SQLite数据库的表格导出为csv格式,并解析csv文件相关推荐
- Android整合SQLite数据库进行基本的增删改查
简言 使用Android整合SQLite数据库进行数据存储,大致可以划分为三步: ①继承 SQLiteOpenHelper,创建数据库 ②继承 ContentProvider 类,重写方法 ③在清单文 ...
- android sqlite 操作类封装,SQLiteUtils 一个简单的基于 Android 的 Sqlite 数据库的操作封装库 @codeKK Android开源站...
一个简单的基于 Android 的 Sqlite 数据库的操作封装,它有如下的好处: 便捷地创建表和增添表字段 通过操作对象来 insert 或者 update 表记录 支持多种查询方式,支持分页查询 ...
- Android studio—SQlite数据库注册登录
Android studio-SQlite数据库注册登录 文章目录 Android studio-SQlite数据库注册登录 创建用户类 创建数据库 注册写入数据库 登录读取数据库 效果展示 布局文件 ...
- Android Studio SQLite数据库应用(一)
Android Studio SQLite数据库应用(一) 版本:Android Studio 1.5.1 创建数据库 升级数据库 CRUD数据操作 SQLite (英语发音:/ˌɛskjuːɛlˈl ...
- Android中SQLite数据库查看及导入导出
Android中可以采用SQLite数据库来存储数据,可是Google却没有直接给我们提供相关工具来管理数据库里的数据. 如果不能直接通过工具来查看,那我们就把数据库从手机/模拟器里面拷贝出来用工具查 ...
- Android之SQLite数据库及SQLiteStudio工具的使用
目录 (一)SQLite介绍 (二)SQLite的使用 1.SQLiteOpenHelper抽象类 2.SQLiteDatabase类操作SQLite数据库 (三)数据库实例 (四)SQLite数据的 ...
- Android Studio SQLite 数据库 增删改查 简单
源码 效果展示 所有操作都在这个界面完成,操作完直接显示 设计 一个class用来创建数据库,建表,一个activity用来执行增删改查操作 代码 DatebaseHlper impo ...
- SQLite数据库导入和导出
学习android开发快一个月了,手头上有个项目要用到SQLite数据库,所以在网上搜了下并结合自己的体会总结了一下关于SQLite数据库的导入和导出的知识. 新建student.bat脚本文件和st ...
- android数据库isnull,Android中SQLite数据库知识点总结
SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...
最新文章
- Centos 7 安装 Haproxy
- Docker安装与镜像,容器命令管理
- 新一代需求管理工具Trufun Bacon X正式发布!
- 31省份开学时间一览表
- dbv mysql_MariaDB与MySQL对比 --- 对分布式事务的支持
- win11如何取消开机自检 windows11取消开机自检的设置方法
- c语言教程入门ppt,C语言基础入门教程.ppt
- Android 测试点归纳总结
- Python常用的软件包
- CodeForces - 1384
- 测绘资质升级申请条件有哪些要求?
- nba app android,NBA app官方版
- 烧录器DediWare General使用方法
- 将Latex tex文档转换成 word文档(下)
- 树莓派存储方案_还在用笨重的NAS存储服务器?你可以自己动手用树莓派DIY一个...
- 顺丰快递代码表java_JAVA接入顺丰快递
- 最新的SpringCloud(H版Alibaba)技术(11-12初级部分,网关【Gateway】)
- python爬虫Pragmatic系列III
- 一段真实在个人经历 给那些迷失方向的朋友 转帖
- Boost日期时间(date_time)—时间
热门文章
- Cpp 对象模型探索 / 继承关系下的虚函数手动调用
- spark 算子使用类变量_自己工作中超全spark性能优化总结
- mysql window怎么安装补丁_window下mysql安装步骤
- c#调用python函数_C#调用python脚本的方法步骤(2种)
- 反编译exe软件_【娱乐向】exe逆向工程(破译《游戏开发课》老师的成绩程序)...
- linux generic什么意思_如何在 Ubuntu Linux 上释放 /boot 分区的空间? | Linux 中国
- 最短路径之--floyd算法--多源最短路径
- 组件与组件之间的通信以及vue2.0中的变化、示例
- error=Error Domain=NSURLErrorDomain Code=-1003
- 剑指offer——不能被继承的类