Android个人手机通讯录开发详解

作者:Pretty_girll 时间:2023-01-22 01:21:30 

一、Android 个人手机通讯录开发

数据存储:SQLite 数据库

开发工具:Android Studio

二、Phone Module 简介

1. 界面展示

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

2. 文件结构简单分析

Android个人手机通讯录开发详解

三、个人手机通讯录代码实现

1. 清单文件 (AndroidManifest.xml)


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alan.directory" >

<application
 android:allowBackup="true"
 android:icon="@drawable/icon_phone"
 android:label="@string/app_name"
 android:supportsRtl="true"
 android:theme="@style/AppTheme" >
 <activity android:name=".MainActivity" >
  <intent-filter>
   <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
</application>

</manifest>

2. MainActivity.java (主文件)


/**
* Created by Alan J on 13/2/2019.
*/

package com.example.alan.directory;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

MyHelper myHelper;
private EditText etName;
private EditText etPhone;
private TextView tvShow;
private Button btnAdd;
private Button btnQuery;
private Button btnUpdate;
private Button btnDelete;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 myHelper = new MyHelper(this);
 init(); //初始化控件
}
private void init(){
 etName = (EditText)findViewById(R.id.et_name);
 etPhone = (EditText)findViewById(R.id.et_phone);
 tvShow = (TextView)findViewById(R.id.tv_show);
 btnAdd = (Button)findViewById(R.id.btn_add);
 btnQuery = (Button)findViewById(R.id.btn_query);
 btnUpdate = (Button)findViewById(R.id.btn_update);
 btnDelete = (Button)findViewById(R.id.btn_delete);
 btnAdd.setOnClickListener(this);   //Button控件设置监听
 btnQuery.setOnClickListener(this);
 btnUpdate.setOnClickListener(this);
 btnDelete.setOnClickListener(this);
 tvShow.setMovementMethod(ScrollingMovementMethod.getInstance()); //设置文本滚动
}
@Override
public void onClick(View v){
 String name;
 String phone;
 SQLiteDatabase db;
 switch (v.getId()){
  case R.id.btn_add:  //添加联系人
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   db = myHelper.getWritableDatabase();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息添加失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("insert into person (name,phone) values(?,?)", new Object[]{name, phone});
    Toast.makeText(this,"联系人信息添加成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;
  case R.id.btn_query: //查询联系人
   db = myHelper.getReadableDatabase();
   Cursor cursor = db.rawQuery("select name,phone from person",null);
   if (cursor.getCount() == 0){
    tvShow.setText("");
    Toast.makeText(this,"空目录",Toast.LENGTH_SHORT).show();
   }else {
    cursor.moveToFirst();
    tvShow.setText("Name:" + cursor.getString(0) + " ; Tel:" + cursor.getString(1));
    while (cursor.moveToNext()){
     tvShow.append("\n" + "Name:" + cursor.getString(0) + " ; Tel:" + cursor.getString(1));
    }
   }
   cursor.close();
   db.close();
   break;
  case R.id.btn_update: //修改联系人
   db = myHelper.getWritableDatabase();
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息修改失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("update person set name=?,phone=? where name=?", new Object[]{name, phone, name});
    Toast.makeText(this,"联系人信息修改成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;
  case R.id.btn_delete: //删除联系人
   db = myHelper.getWritableDatabase();
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息删除失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("delete from person where name=? and phone=?", new Object[]{name, phone});
    Toast.makeText(this,"联系人信息删除成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;
 }
}
}

3. MyHelper.java (数据库文件)


/**
* Created by Alan J on 13/2/2019.
*/

package com.example.alan.directory;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyHelper extends SQLiteOpenHelper{

public MyHelper(Context context){
 super(context, "alan.db", null ,2);
}
@Override

public void onCreate(SQLiteDatabase db){
 db.execSQL("create table person(id integer primary key autoincrement,name varchar(20),phone varchar(20) unique)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

}
}

4. activity_main.xml (XML Layout 布局文件)


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
tools:context=".MainActivity">
<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/lineOne">
 <ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/head"
  android:layout_margin="30dp"/>
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="通 讯 录"
  android:textSize="30dp"
  android:textStyle="bold"
  android:textColor="#BC8F8F"
  android:layout_gravity="center"
  android:layout_marginLeft="50dp"
  />
</LinearLayout>
<LinearLayout
 android:id="@+id/lineTwo"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/lineOne"
 android:layout_marginTop="20dp"
 android:layout_marginLeft="18dp"
 android:layout_marginRight="18dp">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="姓 名 : "
  android:textSize="18dp"
  android:textStyle="bold"/>
 <EditText
  android:id="@+id/et_name"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="  请输入姓名"
  android:textSize="16dp"
  android:maxLength="14"/>
</LinearLayout>
<LinearLayout
 android:id="@+id/lineTree"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/lineTwo"
 android:layout_marginTop="10dp"
 android:layout_marginLeft="18dp"
 android:layout_marginRight="18dp">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="电 话 : "
  android:textSize="18dp"
  android:textStyle="bold"/>
 <EditText
  android:id="@+id/et_phone"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="  请输入手机号码"
  android:textSize="16dp"
  android:maxLength="11"/>
</LinearLayout>
<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/lineFour"
 android:layout_below="@+id/lineTree"
 android:layout_marginTop="30dp"
 android:layout_marginLeft="18dp"
 android:layout_marginRight="18dp"
 android:orientation="horizontal">
 <Button
  android:id="@+id/btn_add"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/shape"
  android:layout_weight="1"
  android:text=" 添 加 "
  android:textSize="16dp"
  android:textColor="#c2c8ec"
  android:textStyle="bold"/>
 <Button
  android:id="@+id/btn_query"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/shape"
  android:layout_weight="1"
  android:layout_marginLeft="4dp"
  android:text=" 查 询 "
  android:textSize="16dp"
  android:textColor="#c2c8ec"
  android:textStyle="bold"/>
 <Button
  android:id="@+id/btn_update"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/shape"
  android:layout_weight="1"
  android:layout_marginLeft="4dp"
  android:text=" 修 改 "
  android:textSize="16dp"
  android:textColor="#c2c8ec"
  android:textStyle="bold"/>
 <Button
  android:id="@+id/btn_delete"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/shape"
  android:layout_weight="1"
  android:layout_marginLeft="4dp"
  android:text=" 删 除 "
  android:textSize="16dp"
  android:textColor="#c2c8ec"
  android:textStyle="bold"/>
</LinearLayout>
<TextView
 android:id="@+id/tv_show"
 android:layout_width="match_parent"
 android:layout_height="180dp"
 android:scrollbars="vertical"
 android:layout_below="@+id/lineFour"
 android:layout_marginTop="20dp"
 android:layout_marginLeft="20dp"
 android:layout_marginRight="18dp"
 android:textSize="20dp"/>
</RelativeLayout>

5. shape.xml (Button 按钮设置)


<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<!--设置背景色-->
<solid android:color="#BC8F8F" />

<!--设置圆角-->
<corners android:radius="105dip" />

<!--设置边框线的宽度和颜色-->
<stroke android:width="0dp" android:color="#B0C4DE" />
</shape>

四、Android 个人通讯录功能测试

1. 添加

分别添加联系人:姓名:小 明 电话:13888899922

姓名:小 莉 电话:15866655588

添加联系人功能验证:姓名:小 明 电话:13888899922

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

添加联系人功能验证:姓名:小 莉 电话:15866655588

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

测试中的一些问题:1. 联系人电话号码不能重复添加,程序会终止退出,因为联系人的电话号码是唯一的(一个人可以有多个手机号,而一个手机号只能一个人使用 {该功能程序已经实现} )。

2. 电话号码长度限制为11位。

3. 联系人信息为空不能成功添加。

再次添加联系人:姓名:小 莉 电话:15866655588

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

上述功能问题限制的重点代码如下:


//联系人电话号码唯一性

@Override

public void onCreate(SQLiteDatabase db){
 db.execSQL("create table person(id integer primary key autoincrement,name varchar(20),phone varchar(20) unique)");
}

//电话号码长度限制

<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="  请输入手机号码"
android:textSize="16dp"
android:maxLength="11"/>

//联系人信息为空时的限制

case R.id.btn_add:  //添加联系人
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   db = myHelper.getWritableDatabase();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息添加失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("insert into person (name,phone) values(?,?)", new Object[]{name, phone});
    Toast.makeText(this,"联系人信息添加成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;

2. 查询

查询通讯录联系人功能验证:

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

联系人查询重点代码:


//查询联系人

case R.id.btn_query:
   db = myHelper.getReadableDatabase();
   Cursor cursor = db.rawQuery("select name,phone from person",null);
   if (cursor.getCount() == 0){
    tvShow.setText("");
    Toast.makeText(this,"空目录",Toast.LENGTH_SHORT).show();
   }else {
    cursor.moveToFirst();
    tvShow.setText("Name:" + cursor.getString(0) + " ; Tel:" + cursor.getString(1));
    while (cursor.moveToNext()){
     tvShow.append("\n" + "Name:" + cursor.getString(0) + " ; Tel:" + cursor.getString(1));
    }
   }
   cursor.close();
   db.close();
   break;

3. 修改

修改联系人功能验证:姓名:小 明 电话:13888899922 ===》》》 姓名:小 明 电话:15888899922

注意小问题:必须输入联系人姓名和电话号码,才可以成功进行修改,在数据库中修改一句name字段值进行匹配

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

联系人修改重点代码:


//修改联系人

case R.id.btn_update:
   db = myHelper.getWritableDatabase();
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息修改失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("update person set name=?,phone=? where name=?", new Object[]{name, phone, name});
    Toast.makeText(this,"联系人信息修改成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;

测试中的一些问题:联系人为空时不能进行修改

Android个人手机通讯录开发详解

上述功能问题限制的重点代码如下:


if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息修改失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("update person set name=?,phone=? where name=?", new Object[]{name, phone, name});
    Toast.makeText(this,"联系人信息修改成功",Toast.LENGTH_SHORT).show();
   }

4. 删除

删除联系人功能验证:姓名:小 明 电话:15888899922

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

联系人删除重点代码:


//删除联系人

case R.id.btn_delete:
   db = myHelper.getWritableDatabase();
   name = etName.getText().toString().trim();
   phone = etPhone.getText().toString().trim();
   if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息删除失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("delete from person where name=? and phone=?", new Object[]{name, phone});
    Toast.makeText(this,"联系人信息删除成功",Toast.LENGTH_SHORT).show();
   }
   db.close();
   break;

测试中的一些问题:联系人为空时不能进行删除

Android个人手机通讯录开发详解

上述功能问题限制的重点代码如下:


if (name.equals("") || phone.equals("")){ //联系人信息不能为空
    Toast.makeText(this,"联系人信息删除失败",Toast.LENGTH_SHORT).show();
   }
   else {
    db.execSQL("delete from person where name=? and phone=?", new Object[]{name, phone});
    Toast.makeText(this,"联系人信息删除成功",Toast.LENGTH_SHORT).show();
   }

来源:https://www.cnblogs.com/prettygirll/p/10371967.html

标签:Android,通讯录
0
投稿

猜你喜欢

  • C语言数据结构之二叉树的非递归后序遍历算法

    2021-12-23 07:10:52
  • utf8编码检测方法分享

    2023-05-18 12:34:27
  • @ConfigurationProperties加载外部配置方式

    2023-11-09 01:14:32
  • Android性能优化全局异常处理详情

    2023-12-26 16:27:27
  • Mybatis通过Spring完成代理类注入的流程分析

    2023-10-25 00:55:55
  • Android Flutter使用本地数据库编写备忘录应用

    2023-09-15 17:24:09
  • C#实现对象XML序列化的方法

    2022-02-11 01:30:59
  • Spring实战之方法级别缓存用法示例

    2022-10-20 02:00:32
  • Android动画之逐帧动画(Frame Animation)实例详解

    2023-02-27 06:12:56
  • flutter升级3.7.3报错Unable to find bundled Java version解决

    2023-07-29 16:57:52
  • .NET程序员如何入门Spring Boot详解

    2022-04-18 08:04:05
  • SpringBoot实现PPT格式文件上传并在线预览功能

    2023-07-22 14:44:56
  • Spring Boot配置Thymeleaf(gradle)的简单使用

    2023-04-18 07:41:42
  • Java剑指offer之删除链表的节点

    2023-05-19 15:30:27
  • 使用java技术抓取网站上彩票双色球信息详解

    2022-01-04 14:47:51
  • C语言new操作的安全性分析

    2021-09-07 05:22:20
  • springboot schedule 解决定时任务不执行的问题

    2021-05-30 05:00:38
  • Android 使用Shell脚本截屏并自动传到电脑上

    2022-07-06 01:21:43
  • Java基于分治算法实现的棋盘覆盖问题示例

    2021-07-17 14:05:16
  • Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法

    2022-07-14 13:19:41
  • asp之家 软件编程 m.aspxhome.com