一、项目概述
安卓通讯录主要实现了对联系人信息(姓名和电话)的增加、删除、修改和查询功能,系统通过SQLite
数据库来存储数据。系统有欢迎、注册和登录页面,先注册后使用。主页面包含对联系人信息增删改查
这四种功能:在添加联系人页面,输入联系人信息,若联系人在数据库中不存在则可以添加成功;在删除和修改用户页面,都可以通过姓名搜索到指定联系人的信息,然后对联系人进行删除或者修改;在查询联系人页面,可以查看到数据库中存储的所有联系人信息,点击任意一项可以拨打电话给对方。
二、开发环境
三、详细设计
1、SQLite数据库
(1)简介
SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!Android内置的SQLite是SQLite 3版本的。SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象) 。
虽然只有五种,但是对于varchar,char等其他数据类型都是可以保存的;因为SQLite有个最大的特点:你可以将各种数据类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
比如你可以在Integer类型的字段中存放String字符串,当然除了声明为主键INTEGER PRIMARY KEY的字段只能够存储64位整数。另外,SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQlite通过文件来保存数据库,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有多条记录,每个记录由多个字段构成,每个字段有对应的值,每个值我们可以指定类型,也可以不指定类型(主键除外)。
(2)使用
MyDBOpenHelper
类继承自 SQLiteOpenHelper
抽象类,负责管理数据库的创建和版本管理。当数据库第一次被创建时,onCreate
方法会被调用,在本项目中创建了两个表格:Contacts
和 User
。Contacts
表用于存储联系人的姓名和电话号码,其中姓名为主键;User
表用于存储用户账户和密码信息,账户为主键。如果数据库版本需要升级,onUpgrade
方法将被执行。
在构造函数 MyDBOpenHelper(Context context)
中,传入了上下文对象和数据库名称addressbook.db,版本号设为1,表示当前版本是初始版本。如果未来需要更新数据库结构,可以通过修改版本号并实现 onUpgrade
方法来完成数据库的迁移工作。
public class MyDBOpenHelper extends SQLiteOpenHelper {
// 数据库文件夹名为addressbook.db,版本号为1
public MyDBOpenHelper(Context context) {
super(context, "addressbook.db", null, 1);
}
// 数据库首次创建时创建数据表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE Contacts(name varchar(20) primary key, phone varchar(20))");
db.execSQL("CREATE TABLE User(account varchar(20) primary key, password varchar(20))");
}
// 数据库版本升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2、欢迎注册登录
欢迎页面在页面中心绘制一张图像,通讯录应用启动时会显示欢迎页面,在显示3000毫秒后自动将用户导航到登录页面。登录页面可以输入账号和密码进行登录,首先对账号和密码进行判空,然后会与数据库中存储的账号信息进行对比,若账号不存在则提示用户,若账号存在且密码也正确匹配则允许登录。注册页面的页面绘制与登录页面相似,都是文本框和输入框的结合。用户注册时系统会判断账号或密码是否为空、两次输入密码是否相同、账号是否已存在等逻辑。总体而言,逻辑理清楚之后实现不算困难。
// 当计时结束,跳转至主页面
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
startActivity(intent);
WelcomeActivity.this.finish();
}
}, 3000);
3、增删改查
ContactsDao
提供了一系列标准的CRUD(创建、读取、更新、删除)操作方法,用于操作数据库管理联系人信息。
ContactsDao
类有一个私有成员变量context
,用于持有对外部类的引用,通常是一个Activity
或Service
。myDBOpenHelper
是一个继承自SQLiteOpenHelper
的辅助类,负责管理数据库的创建和版本管理。sqLiteDatabase
是一个SQLiteDatabase
对象,用于直接执行数据库操作。
类中的方法包括:
open()
:用于打开数据库连接,如果无法获取写入权限则尝试获取只读权限。close()
:用于关闭数据库连接。addContacts(Contacts c)
:向数据库中插入一个新的联系人。deleteContacts(Contacts c)
:根据联系人名字从数据库中删除联系人。updateContacts(Contacts c)
:根据联系人名字更新联系人信息。getContacts(String name)
:查询特定名字的联系人信息。getAllphones()
:获取数据库中所有联系人的电话号码列表。getAllcontacts()
:获取数据库中所有联系人的信息列表,以键值对的形式存储在Map
中。
// 添加联系人
public long addContacts(Contacts c) {
// 先创建集合对象
ContentValues values = new ContentValues();
// 插入键值对
values.put("name", c.name);
values.put("phone", c.phone);
return sqLiteDatabase.insert("Contacts", null, values);
}
// 删除联系人
public int deleteContacts(Contacts c) {
return sqLiteDatabase.delete("Contacts", "name = ?", new String[]{String.valueOf(c.name)});
}
// 修改联系人
public int updateContacts(Contacts c) {
ContentValues value = new ContentValues();
value.put("phone", c.phone);
return sqLiteDatabase.update("Contacts", value, "name = ?", new String[]{String.valueOf(c.name)});
}
// 根据姓名查找联系人
public Contacts getContacts(String name) {
Cursor cursor = sqLiteDatabase.query("Contacts", null, "name = ?", new String[]{name}, null, null, null);
while (cursor.moveToNext()) {
Contacts contacts = new Contacts();
contacts.name = cursor.getString(cursor.getColumnIndex("name"));
contacts.phone = cursor.getString(cursor.getColumnIndex("phone"));
cursor.close();
return contacts;
}
cursor.close();
return null;
}
4、拨打电话
拨打电话的详细步骤分为5步:
-
创建了一个新的
Intent
对象,该行动类型被设置为Intent.ACTION_CALL
,意味着这个意图是用来进行电话呼叫的。 -
从
phoneLists
列表中的pos
位置获取电话号码。phoneLists
是一个字符串列表,包含了多个电话号码。 -
使用获取到的电话号码创建一个电话数据URI,即把电话号码附加到"tel:"协议后面。这个URI代表了要拨打的电话号码。
-
将电话号码的URI作为数据设置给
call
意图,使用intent.setData(...)
。这一步是必须的,它向系统表明了要拨打的具体电话号码。 -
最后,使用
startActivity(intent)
启动这个电话Intent
。这会触发设备上的电话应用程序开始拨打指定的电话号码。
private void call(int pos) {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
String phone = phoneLists.get(pos);
intent.setData(Uri.parse("tel:" + phone));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
需要注意的是,代码中包含了一个try-catch
块,用来捕获SecurityException
异常。这个异常可能会在应用程序没有获得必要的权限去进行电话呼叫时抛出。从Android 6.0(API级别 23)开始,应用程序需要在运行时请求涉及访问用户个人信息的权限,例如日历、相机或电话呼叫。进行电话呼叫需要的权限是android.permission.CALL_PHONE
,如果应用程序没有获得这个权限,那么尝试进行电话呼叫时就会抛出SecurityException
,导致电话呼叫无法发起。因此,为了防止应用程序崩溃,在进行电话呼叫之前检查拨号权限是否已经被授予,如果没有,则需要请求它。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "您允许了拨打电话权限", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "您拒绝了此权限", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
四、运行演示
Android Studio实现通讯录
五、项目总结
安卓通讯录利用SQLite数据库存储联系人信息,实现增删改查功能。用户通过注册登录进入主界面,可轻松管理联系人。应用注重用户体验,如提供操作提示、响应快捷、数据持久化存储等。整个项目结构清晰,逻辑完善,技术实现合理,成功满足了用户需求。
六、源码下载
♻️下面两种方式可以获取源代码和报告 |
---|
1️⃣点击直接下载Android通讯录源码 |
2️⃣点击直接下载Android通讯录报告 |
🚀这有你错过的精彩内容🚀 |
---|
Android Studio实现记事本 |
Android Studio实现选课系统 |
Android Studio实现购物商城App |
Android Studio实现图书管理系统 |
Android Stduio实现外卖订餐系统 |
普劝青年烈士,黄卷名流,发觉悟之心,破色魔之障。芙蓉白面,须知带肉骷髅。美貌红妆,不过蒙衣漏厕。纵对如玉如花之貌,皆存若姊若母之心。未犯淫邪者,宜防失足。曾行恶事者,务劝回头。更祈展转流通,迭相化导。必使在在齐归觉路,人人共出迷津。——《欲海回狂》