玩下软工项目,第一轮--全局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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

red hat linux 安装oracle10g vm,oracle 10g 在 RED HAT ENTERPRISE LINUX 5下的安装

oracle 10g 在 RED HAT ENTERPRISE LINUX 5下的安装ORACLE 10G在LINUX的安装:先上来两张图:DBA是努力的方向,ORACLE DBA包罗万象,连LINUX/UNIX都搞不定,还弄P个ORACLE啊.两部分:1.RED HAT ENTERPRISE LINUX 5的安装难点(对于现在的我来说):1.1YUM本地源的配置;网络有相关资料,不…

jvm垃圾回收机制_深入理解JVM的垃圾回收机制

​如何判断对象已“死”Java堆中存放着几乎所有的对象实例&#xff0c;垃圾回收器在堆进行垃圾回收前&#xff0c;首先要判断这些对象那些还存活&#xff0c;那些已经“死去”。判断对象是否已“死”有如下几种算法&#xff1a;1引用计数法引用计数法描述的算法为&#xff1a;给…

EF sqlite3报错 System.Data.Entity.Core.EntityException: 在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。...

问题&#xff1a;sqlite3使用ef框架操作数据库报错 问题原因&#xff1a;数据库文件没有访问权限 结局方案&#xff1a;可以将数据库文件所在的文件夹的访问权限添加Everyone用户权限。 错误&#xff1a;"System.Data.Entity.Core.EntityException: 在提供程序连接上启动事…

oracle job定时报错,Oracle Job定时任务的使用详解

Oracle中的job能为你做的就是在你规定的时间格式里执行存储过程&#xff0c;定时执行一个任务 。下面是一个小案例&#xff0c;定时每15分钟向一张表插入一条数据一、步骤11.创建一张测试表-- Create tablecreate table A8(a1 VARCHAR2(500))tablespace DSP_DATApctfree 10init…

python调用ping命令_在Python中调用Ping命令,批量IP的方法

#!/usr/bin/env python #coding:UTF-8Author: jefferchen163.com 可在命令行直接带目的IP&#xff0c;也可将IP列表在文本文件中。 pingip.py -d DestIP DestIP示例&#xff1a; a)单个&#xff1a; 192.168.11.1 b)多个: 192.168.11.1;172.16.8.1;176.13.18.2 c)网段: 192.168…

thinkPHP伪静态,如何去掉index.php呢?

如何去掉index.php呢?1.httpd.conf配置文件中加载了mod_rewrite.so模块 //在APACHE里面去配置#LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉2.AllowOverride None 讲None改为 All //在APACHE里面去配置 (注意其他地方的AllowOverride也统统设置为…

chown -r oracle:oinstall /oracle,CentOS7安装Oracle12c图文详解

root身份安装依赖包&#xff1a; yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc libstdc*.i686 libstdc-devel li…

在苹果笔记本如何使用python_mac下如何将python2.7改为python3

1.查看当前电脑python版本 python -V // 显示2.7.x 2.用brew升级python brew update python 3.如果安装成功&#xff0c;去系统目录下回看到两个版本的python cd usr/local/Cellar/ //到此目录下 cd python/ //进入python目录下 查看已安装的python版本&#xff0c;如果有2.x 和…

[BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Submit][Status][Discuss]Description 给定一张有向图&#xff0c;每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求&#xff1a; 1、 …

oracle备份密码文件,[数据库]Oracle数据库备份dmp文件,使用cmd命令导入导出步骤,以及忘记Oracle密码_星空网...

Oracle数据库备份dmp文件&#xff0c;使用cmd命令导入导出步骤,以及忘记Oracle密码2013-07-300dmp文件导入导出步骤1.创建表空间--datafile 的路径随便给&#xff0c;但是后面的文件命名用dbfCREATE TABLESPACE DTBSLOGGINGDATAFILE D:\OracleDateFile\DTBS.DBF SIZE 32MAUTOEX…

python需要花钱下载吗_用Python下载知乎视频,非常实用

原标题&#xff1a;用Python下载知乎视频&#xff0c;非常实用Python下载知乎视频。 # -*- coding: utf-8 -*- """ 下载知乎视频&#xff1a; 依赖&#xff1a; pip install requests mac 安装 ffmpeg: brew install ffmpeg """ import re impor…

php instanceof 基类,PHP强制对象类型之instanceof操作符

一、简介在php(做为现在的主流开发语言)中实现强制对象类型有时可能非常重要。如果缺少了它&#xff0c;或是因为缺乏这方面的知识——基于不正确的编程假设&#xff0c;或者仅仅是由于懒惰&#xff0c;那么你会在特定的Web应用程序中看到你所不希望的结果。特别是当用php(做为…

msyql备份还原

MySQL备份和还原,都是利用mysqldump、mysql和source命令来完成的。 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | cmd |利用“cd \Program Files\MySQL\MySQL Server 5.0\bin”命令进入bin文件夹 | 利用“mysqldump -u 用户名 -p databasename >exportfilename”…

python相比于excel的优势_对照Excel使用Python进行数据分析,更快掌握

Excel和Python&#xff0c;作为数据分析的主流工具&#xff0c;在从效率提升到数据商业化的整个过程中&#xff0c;都起到了重要作用。不管是在Excel中通过鼠标点选实现&#xff0c;亦或是利用Python通过代码实现&#xff0c;数据分析中的很多基础功能都是相通的。 在数据量级大…

oraoledb.oracle 12c,关于OraOLEDB.Oracle找不到驱动问题的一种可能解决方案

如果安装Oracle的时候没有把Oracle Provider for OLE DB&#xff0c;这个组件安装上&#xff0c;那么就会导致在使用程序的时候无法使用Oracle客户端驱动问题&#xff0c;弥补的办法就是重新下载客户端程序。以下介绍win 2008 x64 Oracle 11g x64情况搭建安装驱动程序首先得下…

python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例

本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 二维图像卷积运算 一 代码 import numpy as np from scipy import signal, misc import matplotlib.pyplot as plt image misc.ascent()#二维图像数组…

linux命令行大全 笔记,《Linux命令行大全》读书笔记

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;shell就是一个程序&#xff0c;它接受从键盘输入的命令&#xff0c;然后把命令传递给操作系统执行。当使用图像用户界面时&#xff0c;我们需要一个叫做终端仿真器…

dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。

百度上说 解决方法有两步&#xff1a; 一、先要在系统参数下的其他选项中修改文档标题最大长度&#xff08;如修改为150&#xff09;&#xff0c; 后台系统 - 其它选项 - 文档标题最大长度 默认的是60改为150&#xff0c; 二、修改默认参数后&#xff0c;需要手工修改数据表。 …

python绘制散点图、如何选两列作为横坐标_在matplotlib散点图(水平杆图)中从x=0到数据点绘制水平线...

考虑以下情节&#xff1a;由此函数生成&#xff1a;def timeDiffPlot(dataA, dataB, savetoNone, legNone): labels list(dataA["graph"]) figure(figsizescreenMedium) ax gca() ax.grid(True) xi range(len(labels)) rtsA dataA["running"] / 1000.0…

linux命令基础知识 管道流,linux基础知识-I/O重定向,管道(示例代码)

系统设定默认输出设备&#xff1a;标准输出&#xff0c;STDOUT, 1默认输入设备&#xff1a;标准输入, STDIN, 0标准错误输出&#xff1a;STDERR, 2标准输入&#xff1a;键盘标准输出和错误输出&#xff1a;显示器I/O重定向&#xff1a;Linux:>: 覆盖输出[[email protected] …