(Android学习笔记二)AChartEngine的使用以及在sqlite中存取DATETIME!
2014-05-20 15:30
393 查看
也是说最近买了个电子称,想写个小程序来记录下减肥的成果。输入体重,程序就自动记录并把体重随时间变化的曲线图画出来。
首先是界面设计。如上图所示,就一个界面,内含三个Tab。这个我是照着http://www.eoeandroid.com/thread-1035-1-1.html做的。他把三个Tab的布局都写在同一个XML文件(最外层必须是FrameLayout)里,然后调用inflate方法将XML文件载入,载入之后才能使用Activity.findViewById()来获取其中的界面元素。
第二步是找一个画曲线的工具。这里我选择了AChartEngine。上网去下载jar包和例子,看有没有横坐标是时间的timeChart。果然在demo中找到了ProjectStatusChart.java,看到它横坐标的类型是Date类型,仅仅是日期吗?还能更精确点么?运行下查看这个类型的值,发现一串挺大的数字,是从1900年最初那一刻到现在经过的纳秒,显然够精确了。
接下来怎么把chartview加到我自己的view——第二个tab中去呢?
从AChartEngine的demo代码中看,在列表中选中一个chart,就执行该chart对应的execute函数获得一个intent 并返回,然后通过startActivity(intent)跳转到新的页面。我想要获得新的view加到当前view中,不是跳到另一个intent去啊!仔细看execute函数,它把要画的数据填充后,返回的是return
ChartFactory.getTimeChartIntent(…),幸好ChartFactory还有一个参数一样的方法getTimeChartView,返回类型是GraphicalView。这样就可以将GraphicalView绘制在想要的地方了:
修改execute的返回类型为GraphicalView,在需要绘制图片的地方加上:
[java]
view plaincopyprint?
myChart= new ProjectStatusChart(); LinearLayout layout =(LinearLayout) findViewById(R.id.linearLayout2); GraphicalView chartView=myChart.execute(this); if(chartView!=null) layout.addView((View)chartView, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
下面详细介绍在android的sqlite中存取DATETIME类型的方法。
创建表时:
[java]
view plaincopyprint?
String sql="create table tb3(idINTEGER PRIMARY KEY,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, weight DOUBLE)";
读取时的方法:
[java]
view plaincopyprint?
Cursor cursor = db.rawQuery("selectweight,datetime(timestamp,'localtime') from tb3",null);
String myDate =cursor.getString(cursor.getColumnIndex("datetime(timestamp,'localtime')"));
SimpleDateFormat format = newSimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = format.parse(myDate);
插入数据时,由于timestamp和id能自动生成,只需插入体重数据:
[java]
view plaincopyprint?
ContentValues values=newContentValues(); double nowWeight = Double.parseDouble(weightStr); values.put("weight", nowWeight); db = sqlHelper.getWritableDatabase(); db.insert("tb3", null,values); db.close();
首先是界面设计。如上图所示,就一个界面,内含三个Tab。这个我是照着http://www.eoeandroid.com/thread-1035-1-1.html做的。他把三个Tab的布局都写在同一个XML文件(最外层必须是FrameLayout)里,然后调用inflate方法将XML文件载入,载入之后才能使用Activity.findViewById()来获取其中的界面元素。
第二步是找一个画曲线的工具。这里我选择了AChartEngine。上网去下载jar包和例子,看有没有横坐标是时间的timeChart。果然在demo中找到了ProjectStatusChart.java,看到它横坐标的类型是Date类型,仅仅是日期吗?还能更精确点么?运行下查看这个类型的值,发现一串挺大的数字,是从1900年最初那一刻到现在经过的纳秒,显然够精确了。
接下来怎么把chartview加到我自己的view——第二个tab中去呢?
从AChartEngine的demo代码中看,在列表中选中一个chart,就执行该chart对应的execute函数获得一个intent 并返回,然后通过startActivity(intent)跳转到新的页面。我想要获得新的view加到当前view中,不是跳到另一个intent去啊!仔细看execute函数,它把要画的数据填充后,返回的是return
ChartFactory.getTimeChartIntent(…),幸好ChartFactory还有一个参数一样的方法getTimeChartView,返回类型是GraphicalView。这样就可以将GraphicalView绘制在想要的地方了:
修改execute的返回类型为GraphicalView,在需要绘制图片的地方加上:
[java]
view plaincopyprint?
myChart= new ProjectStatusChart(); LinearLayout layout =(LinearLayout) findViewById(R.id.linearLayout2); GraphicalView chartView=myChart.execute(this); if(chartView!=null) layout.addView((View)chartView, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
myChart= new ProjectStatusChart(); LinearLayout layout =(LinearLayout) findViewById(R.id.linearLayout2); GraphicalView chartView=myChart.execute(this); if(chartView!=null) layout.addView((View)chartView, newLayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));画图的问题解决了,但例子中的数据都是静态的,怎样在android sqlite3数据库中存取时间、体重数据呢?经过艰苦卓绝的研究,发现SQLite采用的是弱类型的字段,任何列能存储任意类型的数据,虽说看上去只支持NULL、INTEGER、REAL、TXT还有BLOB这五种类型,实际上常见SQL类型都支持。
来自create table语句或者强转语句的范例类型名 | 产生的近似 | 用于决定近似的规则 |
INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 | INTEGER | 1 |
CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB | TEXT | 2 |
BLOB no datatype specified | NONE | 3 |
REAL DOUBLE DOUBLE PRECISION FLOAT | REAL | 4 |
NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME | NUMERIC | 5 |
创建表时:
[java]
view plaincopyprint?
String sql="create table tb3(idINTEGER PRIMARY KEY,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, weight DOUBLE)";
String sql="create table tb3(idINTEGER PRIMARY KEY,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, weight DOUBLE)";timestamp字段缺省值是当前时间(基于GMT而不是local time)。这问题导致了记录的时间跟本地实际时间有几个小时的差距,费了我好大工夫才找到解决方法: 存的时候不变,取的时候根据自己所在时区调整时间。这是sqlite中的一个函数datetime所做的工作。
读取时的方法:
[java]
view plaincopyprint?
Cursor cursor = db.rawQuery("selectweight,datetime(timestamp,'localtime') from tb3",null);
String myDate =cursor.getString(cursor.getColumnIndex("datetime(timestamp,'localtime')"));
SimpleDateFormat format = newSimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = format.parse(myDate);
Cursor cursor = db.rawQuery("selectweight,datetime(timestamp,'localtime') from tb3",null); String myDate =cursor.getString(cursor.getColumnIndex("datetime(timestamp,'localtime')")); SimpleDateFormat format = newSimpleDateFormat("yyyy-MM-dd HH:mm"); Date date = format.parse(myDate);
插入数据时,由于timestamp和id能自动生成,只需插入体重数据:
[java]
view plaincopyprint?
ContentValues values=newContentValues(); double nowWeight = Double.parseDouble(weightStr); values.put("weight", nowWeight); db = sqlHelper.getWritableDatabase(); db.insert("tb3", null,values); db.close();
ContentValues values=newContentValues(); double nowWeight = Double.parseDouble(weightStr); values.put("weight", nowWeight); db = sqlHelper.getWritableDatabase(); db.insert("tb3", null,values); db.close();大致就是这些,有问题欢迎交流。哎,还是要多运动减肥才快,每周我要踢两场球!
相关文章推荐
- (Android学习笔记二)AChartEngine的使用以及在sqlite中存取DATETIME!
- Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解
- VC2005使用SQLite,适用于WIN32以及WINCE
- Android学习笔记9——Sqlite使用
- Android学习笔记----18_在SQLite中使用事务
- 开源项目achartengine简单使用
- Android学习笔记36:使用SQLite方式存储数据
- 关于DateTime在远程服务器使用以及日期与时间格式的问题
- AchartEngine 使用总结
- Android之SQLite存取DATETIME类型
- 使用SilverLight chart DateTime Axes的2个小技巧
- android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法
- Android学习笔记--SQLite使用方法
- Android使用SQLiteDatabase直接存取数据与图像
- PHP 分别使用文本文件、XML和sqlite 存取文本的实现
- SQLite在android中的使用,以及常用增删查改的命令代码!
- VC2005使用SQLite,适用于WIN32以及WINCE
- C++ SQLite安装与使用,以及一个问题解决
- Android学习笔记---27_网络通信之通过GET和POST方式提交参数给web应用,以及使用httpClient,来给web项目以post方式发送参数
- android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法