玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息
项目的Github地址:https://github.com/ggrcwxh/LastTime
采用基于git的多人协作开发模式
软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了。第一轮先实现查询通话记录返回对应号码上一次的通话时间。
真机测试下的效果图:显示称呼和上一次通话距离现在的时间,单位小时

API接口:
首先需要创建一个LastTimeDatabaseHelper的对象来创建数据库,建议创建在mainActivity下,创建建议格式如下,传入参数为全局Context;数据库名;允许返回自定义的Cursor,一般填null,当前数据库版本号
public LastTimeDatabaseHelper dbHelper= new LastTimeDatabaseHelper(MyApplication.getContext(),"lasttime.db",null,1);
关于设置亲情号码:建议格式如下:传入参数分别为称呼,电话号码,以及dbHelper
KithAndKinService test =new KithAndKinService("mother","111111",dbHelper);
test.insertToDatabase();
关于删除亲情号码:建议格式如下:传入参数为称呼以及dbHelper
KithAndKinService test2 =new KithAndKinService("mother",dbHelper);
test2.deleteInDatabase()
关于更新数据库通话记录时间,建议格式如下:
CallInfoService call = new CallInfoService(dbHelper);
call.getCallInfos();
call.dataProcessing();
关于查看上一次通话记录时间,建议格式如下,l1为上次通话时间-1970年1月1日 的时长的毫秒数,请在activity上获取当前时间再减去l1,建议获取方法System.currentTimeMillis()
KithAndKinService test3 =new KithAndKinService("mother",dbHelper);
Map<String,String> map1 = test3.seleteInDatabase();
long l1 = Long.valueOf(map1.get("date"));
实现方法:
因为我不写activity,那么我写的功能就要脱离activity了。那么首先要做的就是获取全局Context。
实现的话挺简单的,就是要先理解Context的含义,我是通过看http://www.jianshu.com/p/94e0f9ab3f1d(Context都没弄明白,还怎么做Android开发?)这篇简书理解的。不是主要玩安卓开发的,碰到安卓这些特性还是挺头疼的。实现方法就是写一个Application的子类,然后修改AndroidMainifest.xml。公式化的方法了。实现后就可以通过调用,MyApplication.getContext()获取全局Context了,具体代码如下:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate(){
context=getApplicationContext();
}
public static Context getContext() {
return context;
}
}
android:name=".MyApplication"//在<application></application>中插入
然后就是建立数据库了,用安卓内置的SQLite。讲道理,一般用Litepal来操纵数据库会简单很多,但话又说回来了,我又不是主玩安卓开发的,学习这东西还是从底层开始比较容易懂,所以这里用SQLiteDatabase来操控数据库。
建立数据库:公式化的方法,两个方法是重写SQLiteOpenHelper里的方法,一个用在创建整个数据库的时候,一个用在给数据库升级的时候(比如插入新表)。
public class LastTimeDatabaseHelper extends SQLiteOpenHelper{
public static final String CREATE_KITH_AND_KIN = "create table KITH_AND_KIN ("
+ "call text primary key, "
+"num text,"
+"date integer)";
public LastTimeDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context,name,factory,version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_KITH_AND_KIN);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
增删改查:主要是采用SQLiteDatabase提供的insert()等方法
public class KithAndKinService {
private String call;
private String num;
private long date;
private LastTimeDatabaseHelper dbHelper;
public KithAndKinService(String call,String num,long date,LastTimeDatabaseHelper dbHelper) {
this.call=call;
this.num=num;
this.date=date;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call, String num, LastTimeDatabaseHelper dbHelper) {
this.call=call;
this.num=num;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call,LastTimeDatabaseHelper dbHelper)
{
this.call=call;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call,long date,LastTimeDatabaseHelper dbHelper){
this.call=call;
this.date=date;
this.dbHelper=dbHelper;
}
public KithAndKinService(LastTimeDatabaseHelper dbHelper)
{
this.dbHelper=dbHelper;
}
public void insertToDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("call",call);
values.put("num",num);
if(date!=0)
{
values.put("date",date);
}
db.insert("KITH_AND_KIN",null,values);
}
public void deleteInDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("KITH_AND_KIN","call=?",new String[] {call});
}
public Map<String,String> seleteInDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String temp = "call=?";
String[] temp2 ={call};
String[] temp3 ={"call","num","date"};
Cursor cursor = db.query("KITH_AND_KIN",temp3,temp,temp2,null,null,null);
Map<String,String> map = new HashMap<String,String>();
if (cursor != null && cursor.moveToFirst())
{
map.put("call",cursor.getString(0));
map.put("num",cursor.getString(1));
map.put("date", String.valueOf(cursor.getLong(2)));
}
return map;
}
public List<Map<String,String>> seleteInDatabaseAll(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("KITH_AND_KIN",null,null,null,null,null,null);
List<Map<String,String>> list= new ArrayList<Map<String,String>>();
if (cursor != null && cursor.moveToFirst()) {
do {
Map<String,String> map = new HashMap<String,String>();
map.put("call",cursor.getString(cursor.getColumnIndex("call")));
map.put("num",cursor.getString(cursor.getColumnIndex("num")));
map.put("date",cursor.getString(cursor.getColumnIndex("date")));
list.add(map);
} while (cursor.moveToNext());
}
return list;
}
public void updateToDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("date",date);
db.update("KITH_AND_KIN",values,"call=?",new String[] {call});
}
}
然后是读取用户的通话记录
首先要权限
<uses-permission android:name="android.permission.READ_CALL_LOG" />
然后就是读取通话记录了:主要是读取用resolver.query读取通话记录的数据库,然后更新数据库
public class CallInfoService {
private List<CallInfo> callinfos = new ArrayList<CallInfo>();
private LastTimeDatabaseHelper dbHelper;
public List<CallInfo> getCallinfos() {
return callinfos;
}
public CallInfoService(LastTimeDatabaseHelper dbHelper){
this.dbHelper=dbHelper;
}
public void getCallInfos() {
ContentResolver resolver = MyApplication.getContext().getContentResolver();
Uri uri = CallLog.Calls.CONTENT_URI;
String[] projection = new String[]{
CallLog.Calls.NUMBER,
CallLog.Calls.DATE,
CallLog.Calls.TYPE
};
if (ActivityCompat.checkSelfPermission(MyApplication.getContext(), Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
return ;
}
Cursor cursor = resolver.query(uri, projection, null, null, null);
while (cursor.moveToNext()){
if(cursor.getInt(2)==2)//OUTGOING_TYPE=2
{
String number=cursor.getString(0);
long date = cursor.getLong(1);
boolean flag=false;
for(CallInfo attribute:callinfos)
{
if(attribute.getNumber().equals(number)) {
if(attribute.getDate()<date)
{
attribute.setDate(date);
flag=true;
break;
}
}
}
if(flag==false)
{
CallInfo temp = new CallInfo(number,date);
callinfos.add(temp);
}
}
}
cursor.close();
}
public void dataProcessing(){
KithAndKinService kaks = new KithAndKinService(dbHelper);
List<Map<String,String>> all= kaks.seleteInDatabaseAll();
for(CallInfo attribute : callinfos)
{
for(int i =0 ;i<all.size();i++)
{
if(attribute.getNumber().equals(all.get(i).get("num")))
{
KithAndKinService temp = new KithAndKinService(all.get(i).get("call"),all.get(i).get("num"),attribute.getDate(),dbHelper);
temp.updateToDatabase();
}
}
}
}
}
下一节预告:读取图片exif信息,获取拍摄日期经纬度,确定大致位置
玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息的更多相关文章
- Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)
摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作,暂时全部 ...
- ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)
Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...
- MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- 一个使用MVC3+NHibernate “增删改查” 的项目
一个使用MVC3+NHibernate “增删改查” 的项目 前言: 谈到NHibernate大伙并不陌生,搞Java的更是清楚,Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框 ...
- .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务
连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层 ...
- 一个使用MVC3+NHibernate “增删改查” 的项目(修正版)
前言: 谈到NHibernate大伙并不陌生,搞Java的更是清楚,Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常 ...
- node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...
- 如何搭建一个WEB服务器项目(二)—— 对数据库表进行基本的增删改查操作
使用HibernateTemplate进行增删改查操作 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出 ...
- SSM整合_年轻人的第一个增删改查_基础环境搭建
写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建 SSM整合_年轻人的第一个增删改查_查找 SSM整合_年轻人的第一个增删改查_新增 SSM整合_年轻人的第一个增删改查_修改 SSM整合_年 ...
随机推荐
- html-头标签的使用
HTML两部分组成 head和body ** 在head里面的标签就是头标签 ** title标签:表示在标签上显示的内容 ** meta标签:设置页面的一些相关内容(用的比较少) <meta ...
- Docker toolbox换源
一 docker toolbox安装 略.... 阿里云加速器地址 https://jbriwmh3.mirror.aliyuncs.com 二 为docker toolbox更换国内源 docker ...
- BLDC无刷直流电机的原理及驱动基础
无刷直流电机(BLDC,也称为马达驱动)是电机和控制技术相结合的产品,电调控制电机的运行,从电流驱动角度来看,无刷直流电机可分为正弦波驱动和方波驱动.通常,以方波驱动的电机称为无刷直流电机(BLDC) ...
- linux-2.6.22.6内核启动分析之head.S引导段代码
学习目标: 了解arch/arm/kernel/head.S作为内核启动的第一个文件所实现的功能! 前面通过对内核Makefile的分析,可以知道arch/arm/kernel/head.S是内核启动 ...
- 海思平台交叉编译curl支持SSL功能
1.准备工具 1).交叉编译工具 2).下载libcurl和openssl源代码,我使用的是(openssl-1.0.2o.tar,curl-7.59.0.tar) 3).查看cpu详细 ~ # ca ...
- android一个下拉放大库bug的解决过程及思考
android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...
- Go 学习之路:异常处理defer,panic,recover
Go没有像Java那样的异常机制,它不能抛出异常.因为设计者们认为,将异常与控制结构混在一起容易使得代码变得混乱.于是乎引入Exception处理: defer,panic,recover; 简单描述 ...
- go学习之文件读取问题(需更新)
go学习之文件读取问题(需更新) 一,问题: 今天做一个GO广度迷宫问题时,出现了一个奇怪的问题. 就是通过fmt.Fscanf()读取文件时,每行末尾多出一个0. 二,问题代码: 1,输入文件maz ...
- 那些年我们追过的C#奇葩关键字——忐忑
说到中国的歌坛,不能光说张学友这种大咖吧,我看那些怪咖更给力,比如我们的龚琳娜童鞋,一首神曲<忐忑>唱的那叫不可收拾,而且听到的改编版本更多,每一次都是心怀忐忑,就像C#里的那些关键字 说 ...
- 【LG4587】[FJOI2016]神秘数
[LG4587][FJOI2016]神秘数 题面 洛谷 题解 首先我们想一想暴力怎么做 对于一段区间\([l,r]\) 我们先将它之间的数升序排序 从左往右扫, 设当前我们可以表示出的数为\([1,x ...