玩下软工项目,第一轮--全局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了,具体代码如下:
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的建立与增删改查,读取用户通话记录信息...相关推荐
- 新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
文章目录 一.JDBC下载与导入 二.获取连接 三.PreparedStatement类操作数据库 四.操作BLOB类型字段(图片视频等) 五.Batch批量插入
- 【java项目学习笔记】Java学生管理系统(纯后端基础--增删改查)
学生管理系统 在一所学校中,对学生人员流动的管理是很麻烦的,本案例要求编写一个学生管理系统,实现对学生信息的添加.删除.修改和查询功能.每个功能的具体要求如下: 系统的首页 用于显示系统所有的操作,并 ...
- Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)
阅读目录 摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作 ...
- .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务
连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层 ...
- SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...
- 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
GitHub项目地址: https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式 ...
- 一篇文章教会你创建vue项目和使用vue.js实现数据增删改查
简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...
- list vue 添加数据方法_一篇文章教会你创建vue项目和使用vue.js实现数据增删改查...
简介:一篇文章教会你创建vue项目和使用vue.js实现数据增删改查 [一.项目背景] 在管理员的一些后台页面里,数据列表中都会对这些数据进行增删改查的操作,例如管理员添加商品.修改商品价格.删除商品 ...
- Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)
Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等. 几点说明: Spring boot开发web项目,通常打成 ...
最新文章
- nginx解析php
- .net 垃圾回收机制
- Python爬虫项目---批量下载深圳证券信息
- 云原生是什么?它从哪里来?又到哪里去?
- [转载] python中list的方法有哪些_Python 列表(list)中的方法
- 【初级04】JVM线程模型
- 从LR到DNN点击率预估
- 最近抖音超火的60帧高清视频制作教程
- WDS桥接和WDS中继的区别
- Ubuntu 修改鼠标中键功能
- 设计模式学习之—我是一个粉刷匠(装饰模式)
- POJ 3626 Mud Puddles (BFS)
- Python计算时间差天数
- 《Globally and locally consistent image completion》图像修复论文解读
- WPF入门教程系列(2)---基础篇
- 项目国际化I18N多语言切换
- 华为推送服务 | 简单一招,提高用户活跃和留存
- 我与我的专业计算机作文500字,电脑走进我的生活作文500字
- AcWing 844.走迷宫
- Lidar based off-road negative obstacle detection and analysis(论文翻译)
热门文章
- vs点击方法跳不到对于的地方_内脏脂肪怎么测?这个方法也太方便了!| EASD 2020...
- Spring Cloud —— 消息队列与 RocketMQ
- linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
- java compare equla_Java中的equals,==,compareTo和compare的比较
- html5把六张图片做成立方体,HTML5绘制在立方体上的几何曲线图形
- java中execquery(),javaee登录界面
- 计算机网络段标试卷,计算机网络基础-段标-第2章.ppt
- npm install packagename 安装失败的解决办法
- JAVA 从菜鸟成长为大牛的必经之路
- python 概率分布类型检验_统计学:假设检验Python案例实现+概率论基础知识回顾...