项目的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了,具体代码如下:

 1 public class MyApplication extends Application {
 2     private static Context context;
 3     @Override
 4     public void onCreate(){
 5         context=getApplicationContext();
 6     }
 7     public static Context getContext() {
 8         return context;
 9     }
10 }

1 android:name=".MyApplication"//在<application></application>中插入

然后就是建立数据库了,用安卓内置的SQLite。讲道理,一般用Litepal来操纵数据库会简单很多,但话又说回来了,我又不是主玩安卓开发的,学习这东西还是从底层开始比较容易懂,所以这里用SQLiteDatabase来操控数据库。

建立数据库:公式化的方法,两个方法是重写SQLiteOpenHelper里的方法,一个用在创建整个数据库的时候,一个用在给数据库升级的时候(比如插入新表)。

 1 public class LastTimeDatabaseHelper extends SQLiteOpenHelper{
 2     public static final String CREATE_KITH_AND_KIN = "create table KITH_AND_KIN ("
 3             + "call text primary key, "
 4             +"num text,"
 5             +"date integer)";
 6
 7     public LastTimeDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
 8         super(context,name,factory,version);
 9
10     }
11
12     @Override
13     public void onCreate(SQLiteDatabase sqLiteDatabase) {
14         sqLiteDatabase.execSQL(CREATE_KITH_AND_KIN);
15     }
16
17     @Override
18     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
19
20     }
21 }

增删改查:主要是采用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信息,获取拍摄日期经纬度,确定大致位置

转载于:https://www.cnblogs.com/wkmocr/p/7676444.html

玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...相关推荐

  1. 新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

    文章目录 一.JDBC下载与导入 二.获取连接 三.PreparedStatement类操作数据库 四.操作BLOB类型字段(图片视频等) 五.Batch批量插入

  2. 【java项目学习笔记】Java学生管理系统(纯后端基础--增删改查)

    学生管理系统 在一所学校中,对学生人员流动的管理是很麻烦的,本案例要求编写一个学生管理系统,实现对学生信息的添加.删除.修改和查询功能.每个功能的具体要求如下: 系统的首页 用于显示系统所有的操作,并 ...

  3. Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)

    阅读目录 摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作 ...

  4. .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务

    连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层 ...

  5. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...

  6. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub

    GitHub项目地址: https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式 ...

  7. 一篇文章教会你创建vue项目和使用vue.js实现数据增删改查

    简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...

  8. list vue 添加数据方法_一篇文章教会你创建vue项目和使用vue.js实现数据增删改查...

    简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...

  9. Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)

    Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等. 几点说明: Spring boot开发web项目,通常打成 ...

最新文章

  1. nginx解析php
  2. .net 垃圾回收机制
  3. Python爬虫项目---批量下载深圳证券信息
  4. 云原生是什么?它从哪里来?又到哪里去?
  5. [转载] python中list的方法有哪些_Python 列表(list)中的方法
  6. 【初级04】JVM线程模型
  7. 从LR到DNN点击率预估
  8. 最近抖音超火的60帧高清视频制作教程
  9. WDS桥接和WDS中继的区别
  10. Ubuntu 修改鼠标中键功能
  11. 设计模式学习之—我是一个粉刷匠(装饰模式)
  12. POJ 3626 Mud Puddles (BFS)
  13. Python计算时间差天数
  14. 《Globally and locally consistent image completion》图像修复论文解读
  15. WPF入门教程系列(2)---基础篇
  16. 项目国际化I18N多语言切换
  17. 华为推送服务 | 简单一招,提高用户活跃和留存
  18. 我与我的专业计算机作文500字,电脑走进我的生活作文500字
  19. AcWing 844.走迷宫
  20. Lidar based off-road negative obstacle detection and analysis(论文翻译)

热门文章

  1. vs点击方法跳不到对于的地方_内脏脂肪怎么测?这个方法也太方便了!| EASD 2020...
  2. Spring Cloud —— 消息队列与 RocketMQ
  3. linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
  4. java compare equla_Java中的equals,==,compareTo和compare的比较
  5. html5把六张图片做成立方体,HTML5绘制在立方体上的几何曲线图形
  6. java中execquery(),javaee登录界面
  7. 计算机网络段标试卷,计算机网络基础-段标-第2章.ppt
  8. npm install packagename 安装失败的解决办法
  9. JAVA 从菜鸟成长为大牛的必经之路
  10. python 概率分布类型检验_统计学:假设检验Python案例实现+概率论基础知识回顾...