基于java的Android手机通讯录【详细】【完整代码】

这篇具有很好参考价值的文章主要介绍了基于java的Android手机通讯录【详细】【完整代码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:代码在基本模块中,教程纯文字,推荐两个屏幕一边看代码一边看教程
简易Android通讯录系统,只要半天就能写完!
(博主安卓一些功能用的不熟练)



前言

需要掌握学习的知识点:
1、基本的UI界面编写。
2、Intent的基本使用。
3、Menu的基本使用。
4、RecyclerView的基本使用。
5、SharedPreferences的基本使用。
6、SQLite数据库的基本使用(简单的SQL增删改查)。

提示:加粗的加粗的知识点是必须掌握的,未加粗的知识点可以用其他方式替代。


一、基本模块代码(包含UI界面代码)

提示:以下是纯代码,代码中有部分逻辑注释

Activity类:

(1)主页面MainActivity

package com.example.maillist;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import java.util.Comparator;
import java.util.List;

/**
 * 显示联系人主页面
 * 可以跳转到添加联系人
 * 可以跳转到拨打电话
 * 可以跳转到联系人详细信息
 */
public class MainActivity extends AppCompatActivity {

    List<Contacts> list;//数据库中读取的联系人数据
    MySQLite mMySQLite = MySQLite.getMySQLite(this);//操作数据库的对象


    //活动一开始旧执行的代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialization();
    }

    //活动创建需要初始化的数据
    private void initialization() {
        initContacts();
        initRecyclerView();
    }

    //活动重新开始,重新执行初始化数据,将数据库中修改的数据直接同步一遍
    @Override
    protected void onRestart() {
        super.onRestart();
        initialization();
    }


    //软件运行时,修改数据库后刷新控件
    private void initRecyclerView() {
        //获取RecycleView对象
        RecyclerView recycle = (RecyclerView) findViewById(R.id.recycle_view);
        //创建自定义适配器
        MyAdapter adapter = new MyAdapter(list, this);
        //用于指定布局方式
        RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
        recycle.setLayoutManager(manager);
        recycle.setAdapter(adapter);
    }


    //打开软件获取数据库数据,初始化联系人列表
    private void initContacts() {
        //从数据库中查询联系人信息
        list = mMySQLite.query();
        //排序显示
        list.sort(new Comparator<Contacts>() {
            @Override
            public int compare(Contacts o1, Contacts o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
    }


    //动态加载菜单布局
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //动态加载菜单布局
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    //菜单点击事件
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add_menu://添加联系人 - 跳转到添加联系人界面
                Intent intent = new Intent(MainActivity.this, ContactsAdd.class);
                startActivity(intent);
                break;
            case R.id.back_menu://退出程序
                finish();
                break;
            default:
                break;
        }
        return true;
    }

}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

(2)增加联系人ContactsAdd

package com.example.maillist;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
 * 添加联系人的Activity界面,管理界面控件并处理添加联系人的逻辑
 */
public class ContactsAdd extends AppCompatActivity implements View.OnClickListener{

    //添加联系人活动的一些控件
    EditText name;
    EditText phoneNumber;
    Button confirm;
    Button temp;
    Button back;

    MySQLite mMySQLite = MySQLite.getMySQLite(this);

    //0 - back 1 - save 2 - yes
    int flag = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_layout);
        initView();
        setClickButton();
        //取出临时存储的数据
        getTemp();
    }

    //执行活动销毁的业务逻辑
    @Override
    protected void onDestroy() {
        super.onDestroy();

        //根据状态执行对应逻辑
        switch(flag){
            case 0://back
                clearEditText();
                break;
            case 1://save
                break;
            case 2://yes
                clearEditText();
                break;
        }
        saveTemp();

    }

    //初始化控件对象
    private void initView() {
        name = (EditText) findViewById(R.id.name_add_edit);
        phoneNumber = (EditText) findViewById(R.id.phone_number_add_edit);
        confirm = (Button) findViewById(R.id.add_back_button);
        temp = (Button) findViewById(R.id.add_temp_button);
        back = (Button) findViewById(R.id.add_yes_button);
    }
    //为按键设置监听器
    private void setClickButton() {
        confirm.setOnClickListener(this);
        temp.setOnClickListener(this);
        back.setOnClickListener(this);
    }

    //设置按键点击事件
    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.add_back_button:
                flag = 0;
                finish();
                break;
            case R.id.add_temp_button://临时存储这个页面的数据
                flag = 1;
                finish();
                break;
            case R.id.add_yes_button://将这个页面的数据存放到联系人数据库中
                flag = 2;
                createContacts();
                break;
        }

    }

    private void createContacts() {
        //根据用户输入创建一个联系人对象
        Contacts contacts = new Contacts(name.getText().toString(), phoneNumber.getText().toString(), 0, 0);
        if(contacts.getPhoneNumber() != null && !contacts.getPhoneNumber().equals("")) {//判断是否输入号码
            //将联系人对象添加到数据库
            mMySQLite.add(contacts);
            Toast.makeText(this, "添加成功!", Toast.LENGTH_SHORT).show();

            finish();
        }
        else{
            Toast.makeText(this, "数据有误!", Toast.LENGTH_SHORT).show();
        }
    }


    private void clearEditText() {
        //这个是为了保存后不在将输入框的数据存放到文件,避免添加成功后,下次恢复已经添加的数据到添加输入框中
        name.setText("");
        phoneNumber.setText("");
    }


    //临时存储数据到文件中
    public void saveTemp(){
        //使用SharedPreferences存储临时数据
        SharedPreferences temp = getSharedPreferences("temp", MODE_PRIVATE);
        SharedPreferences.Editor editor = temp.edit();
        editor.putString("name",name.getText().toString());
        editor.putString("phoneNumber", phoneNumber.getText().toString());
        editor.apply();
    }

    //恢复文件中临时存储的数据
    private void getTemp() {
        SharedPreferences temp = getSharedPreferences("temp", MODE_PRIVATE);
        String name = temp.getString("name", "");
        String phoneNumber = temp.getString("phoneNumber", "");
        this.name.setText(name);
        this.phoneNumber.setText(phoneNumber);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp">

        <TextView
            android:id="@+id/name_add_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名:"
            android:textSize="35sp" />

        <EditText
            android:id="@+id/name_add_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_toRightOf="@id/name_add_text"
            android:hint="请输入联系人姓名"
            android:textSize="20dp" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp">

        <TextView
            android:id="@+id/phone_number_add_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="电话:"
            android:textSize="35sp" />

        <EditText
            android:id="@+id/phone_number_add_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/phone_number_add_text"
            android:hint="请输入联系人电话"
            android:textSize="20dp" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp">

        <Button
            android:id="@+id/add_back_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="返回" />

        <Button
            android:id="@+id/add_temp_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="存为草稿" />

        <Button
            android:id="@+id/add_yes_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="确认" />
    </RelativeLayout>


</LinearLayout>

(3)联系人信息ContactsInfo

package com.example.maillist;


import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
 * 显示联系人详细信息
 * 可以跳转到编辑联系人活动
 * 可以删除联系人
 */
public class ContactsInfo extends AppCompatActivity implements View.OnClickListener {

    TextView mName;
    TextView mPhoneNumber;
    Button back;
    Button update;
    TextView delete;

    //临时存储当前对象的数据信息
    int id;
    String name;
    String phoneNumber;

    MySQLite mMySQLite = MySQLite.getMySQLite(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacts_info);
        //获取上一个活动传递的数据
        Intent intent = getIntent();
        id = intent.getIntExtra("id", -1);
        //初始化并设置点击事件
        initView();//初始化控件
        initText(id);//初始化显示文本
        setClickButtons();//设置按键点击监听器
    }


    @Override
    protected void onRestart() {
        super.onRestart();
        initText(id);
    }

    //根据id获取数据库中的数据,并且完成当前联系人信息的初始化
    private void initText(int id) {
        MySQLite db = MySQLite.getMySQLite(this);
        Contacts contacts = db.query(id);
        name = contacts.getName();
        phoneNumber = contacts.getPhoneNumber();
        if (name != null && phoneNumber != null) {
            mName.setText(name);
            mPhoneNumber.setText(phoneNumber);
        } else {//如果此id在数据库中没有获取到数据,给出提示
            Toast.makeText(this, "Info:系统出错,请稍后再试!", Toast.LENGTH_SHORT).show();
        }
    }

    private void setClickButtons() {
        back.setOnClickListener(this);
        update.setOnClickListener(this);
        delete.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.back_info_button:
                finish();
                break;
            case R.id.update_info_button:
                Intent intent = new Intent(ContactsInfo.this, ContactsUpdate.class);
                intent.putExtra("id", id);
                startActivity(intent);
                break;
            case R.id.delete_info_text:
                dialog();//删除提示
                break;
        }

    }

    //删除提示消息框
    private void dialog() {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle("提示:");//提示框
        dialog.setMessage("删除联系人将无法恢复,是否继续?");//提示框消息内容
        dialog.setCancelable(false);//是否可以使用back(返回退出对话框)
        dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {//设置确定点击事件
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mMySQLite.delete(id);//数据库中删除
                finish();
            }
        });
        dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(ContactsInfo.this, "取消删除!", Toast.LENGTH_SHORT).show();
            }
        });
        dialog.show();//将提示消息框显示

    }

    private void initView() {
        mName = (TextView) findViewById(R.id.name_info_text);
        mPhoneNumber = (TextView) findViewById(R.id.phone_number_info_text);
        back = (Button) findViewById(R.id.back_info_button);
        update = (Button) findViewById(R.id.update_info_button);
        delete = (TextView) findViewById(R.id.delete_info_text);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="80dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名:"
            android:textSize="30dp" />

        <TextView
            android:id="@+id/name_info_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="姓名"
            android:textSize="40dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="50dp"
            android:text="电话:"
            android:textSize="30dp" />

        <TextView
            android:id="@+id/phone_number_info_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="联系人电话"
            android:textSize="30dp" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp">

        <Button
            android:id="@+id/back_info_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="返回"
            android:textSize="30dp" />

        <Button
            android:id="@+id/update_info_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="编辑"
            android:textSize="30dp" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/delete_info_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="20dp"
            android:text="删除联系人"
            android:textColor="@color/red"
            android:textSize="20dp" />
    </RelativeLayout>


</LinearLayout>

(4)修改联系人ContactsUpdate

package com.example.maillist;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
 * 联系人信息编辑界面
 */
public class ContactsUpdate extends AppCompatActivity implements View.OnClickListener {

    private int id;
    EditText name;
    EditText phoneNumber;
    Button save;
    Button back;

    MySQLite mMySQLite = MySQLite.getMySQLite(this);

    Contacts mContacts;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacts_update_layout);
        initView();
        initEdit();
        setClickButton();


    }

    private void setClickButton() {
        save.setOnClickListener(this);
        back.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.save_update_button:
                saveUpdate();//保存修改的数据到数据库中
                break;
            case R.id.back_update_button:
                Toast.makeText(this, "修改取消!", Toast.LENGTH_SHORT).show();
                break;
        }
        finish();
    }

    private void saveUpdate() {
        mContacts.setId(id);
        mContacts.setName(name.getText().toString());
        mContacts.setPhoneNumber(phoneNumber.getText().toString());
        mMySQLite.update(mContacts);//修改数据库
        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
    }


    //根据id从数据库中查询数据,对输入框将旧数据显示
    private void initEdit() {
        mContacts = mMySQLite.query(id);
        if (mContacts != null) {
            this.name.setText(mContacts.getName());
            this.phoneNumber.setText(mContacts.getPhoneNumber());
        }
    }

    private void initView() {
        id = getIntent().getIntExtra("id", -1);
        name = (EditText) findViewById(R.id.name_update_edit);
        phoneNumber = (EditText) findViewById(R.id.phone_number_update_edit);
        save = (Button) findViewById(R.id.save_update_button);
        back = (Button) findViewById(R.id.back_update_button);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="100dp"
        android:layout_marginRight="50dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名:"
            android:textSize="30dp" />

        <EditText
            android:id="@+id/name_update_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="待修改的姓名"
            android:textSize="40dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="50dp"
            android:text="电话:"
            android:textSize="30dp" />

        <EditText
            android:id="@+id/phone_number_update_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:hint="待修改的电话"
            android:textSize="30dp" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp">

        <Button
            android:id="@+id/back_update_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="取消"
            android:textSize="30dp" />

        <Button
            android:id="@+id/save_update_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="保存"
            android:textSize="30dp" />
    </RelativeLayout>
</LinearLayout>

工具类:

(1)联系人对象Contacts

package com.example.maillist;


/**
 * 联系人对象
 * 一些联系人对象信息的相关操作
 */
public class Contacts {

    private int id;
    private String name;//姓名
    private String phoneNumber;//电话号码


    public Contacts(String name, String phoneNumber, int call_icon, int more_icon) {
        this.name = name;
        setPhoneNumber(phoneNumber);
    }

    public String getName() {
        return name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

(2)自定义适配器MyAdapter

package com.example.maillist;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * RecyclerView自定义适配器
 * 动态加载了子项的资源
 * 编写了子项的点击逻辑
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    List<Contacts> list;
    Activity main;//传入主活动对象,用于调用startActivity跳转页面

    static class ViewHolder extends RecyclerView.ViewHolder {
        View contacts;//记录父类控件id
        int id;
        TextView contactsName;
        TextView contactsPhoneNumber;
        TextView contactsCall;
        TextView contactsMore;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            //初始化控件
            contacts = itemView;//记录这个父类控件id
            contactsName = itemView.findViewById(R.id.contacts_name);
            contactsPhoneNumber = itemView.findViewById(R.id.contacts_phone_number);
            contactsCall = itemView.findViewById(R.id.call_icon);
            contactsMore = itemView.findViewById(R.id.more_icon);
        }
    }

    //创建一个可以传入数据的构造器
    public MyAdapter(List<Contacts> list, Activity activity) {
        this.list = list;
        main = activity;//构造器初始化传入的主活动对象
    }

    //onCreateViewHolder方法用于ViewHolder滑动到屏幕是动态加载加载布局,并且将加载的布局返回后存储
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_item, parent, false);
        ViewHolder holder = new ViewHolder(view);

        //设置点击监听
        holder.contactsCall.setOnClickListener(new View.OnClickListener() {//拨打电话
            @Override
            public void onClick(View v) {//设置拨打电话Intent跳转
                String phoneNumber = holder.contactsPhoneNumber.getText().toString();
                Intent intent = new Intent(Intent.ACTION_DIAL);//意图:拨号行动
                intent.setData(Uri.parse("tel:" + phoneNumber));//设置对应的号码
                main.startActivity(intent);
            }
        });
        holder.contactsMore.setOnClickListener(new View.OnClickListener() {//跳转至详情页面
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(main, ContactsInfo.class);
                intent.putExtra("id", holder.id);
                intent.putExtra("name", holder.contactsName.getText().toString());
                intent.putExtra("phoneNumber", holder.contactsPhoneNumber.getText().toString());
                main.startActivity(intent);
            }
        });
        holder.contacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
        return holder;
    }


    //为滑动到屏幕的holder布局设置资源文件
    //传入一个holder和对应的号数,为其设置资源文件
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Contacts contacts = list.get(position);
        holder.id = contacts.getId();//设置每个子项的id
        holder.contactsName.setText(contacts.getName());
        holder.contactsPhoneNumber.setText(contacts.getPhoneNumber());
        holder.contactsCall.setText("📞");
        holder.contactsMore.setText("···");
    }

    @Override
    public int getItemCount() {
        return list.size();
    }


}

(3)数据库管理MySQLite

package com.example.maillist;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

/**
 * 完成数据库的操作,继承SQLiteOpenHelper帮助类
 */
public class MySQLite extends SQLiteOpenHelper {

    private static final String TAG = "MySQLite";
    private static MySQLite mMySQLite;
    SQLiteDatabase db;

    public static final String CREATE_CONTACTS_LIST = "create table ContactsList(" +
            "id integer primary key autoincrement," +
            "name text," +
            "phoneNumber text)";

    private MySQLite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //确保只有一个数据库操作对象 - 单例
    public static MySQLite getMySQLite(Context context) {
        if (mMySQLite == null) {
            mMySQLite = new MySQLite(context, "Contacts", null, 1);
        }
        return mMySQLite;
    }


    //数据库表的创建
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建一个联系人表
        db.execSQL(CREATE_CONTACTS_LIST);

    }

    //数据库版本升级
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table ContactsList");
        onCreate(db);
    }

    //添加一条数据到数据库
    public void add(Contacts contacts) {

        db = getWritableDatabase();
        db.execSQL("insert into ContactsList(name,phoneNumber) values(?,?)", new String[]{contacts.getName(), contacts.getPhoneNumber()});
        db.close();
//        ContactsList.addContacts(contacts);
        query();
    }

    //根据id删除一条数据
    public void delete(int id) {
        db = getWritableDatabase();
        String s = "" + id;
        db.execSQL("delete from ContactsList where id = ?", new String[]{s});
        db.close();
    }

    //查询全部数据
    public List<Contacts> query() {
        db = getWritableDatabase();
        Cursor cursor = db.rawQuery("select * from ContactsList", null);
        ArrayList<Contacts> list = new ArrayList<>();
        //将联系人信息找到并添加到联系人列表中
        Contacts contacts;
        if (cursor.moveToFirst()) {
            do {
                @SuppressLint("Range") int id = cursor.getInt(cursor.getColumnIndex("id"));
                @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
                @SuppressLint("Range") String phoneNumber = cursor.getString(cursor.getColumnIndex("phoneNumber"));
                contacts = new Contacts(name, phoneNumber, 0, 0);
                contacts.setId(id);//设置id
                list.add(contacts);
            } while (cursor.moveToNext());
        }
        db.close();
        return list;
    }


    //根据id查询一条数据
    public Contacts query(int id) {
        db = getWritableDatabase();
        Cursor cursor = db.rawQuery("select * from ContactsList where id = ?", new String[]{"" + id});
        Contacts contacts = null;
        if (cursor.moveToFirst()) {
            @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
            @SuppressLint("Range") String phoneNumber = cursor.getString(cursor.getColumnIndex("phoneNumber"));
            contacts = new Contacts(name, phoneNumber, 0, 0);
        }
        db.close();
        return contacts;
    }

    //修改数据库的数据,传入一个需要修改的数据对象
    public void update(Contacts contacts) {
        db = getWritableDatabase();
        db.execSQL("update ContactsList set name = ?,phoneNumber = ? where id = ?", new String[]{contacts.getName(), contacts.getPhoneNumber(), contacts.getId() + ""});
        db.close();
    }

}

二、实现逻辑

1、逻辑执行图

基于java的Android手机通讯录【详细】【完整代码】

这是整个通讯录的简单界面跳转逻辑(第一次画这个东西,代码写完了再画图,ԾㅂԾ,,凑合看看),每个Activity都通过MySQLit类,根据上一个Activity传递的值对数据库和当前界面控件进行操作。

2、功能实现

ContactsAdd:

(1)增加联系人
SharedPreferences实现存草稿

初始化一些控件,为按钮添加点击事件。
调用getTemp恢复之前存储的草稿。

1、联系人添加:
当用户再输入框界面完成对姓名电话的输入,按下保存按钮时,将当前flag状态记录为2,获取输入框中的信息,封装为Contacts对象,通过MySQLite类的add()方法传封装好的对象,将数据添加到数据库中。

2、存为草稿:
当用户按下存为草稿时,将当前flag状态记录为1,然后执行finish()结束当前Activity

3、返回:
当用户按下返回时,将当前flag状态记录为0,然后执行finish()结束当前Activity

4.onDestory():
Activity被销毁时,会调用此方法,在此方法中,根据先前记录的flag状态,判断是否将输入框中的数据存储到文件中。

RecyclerView:

点击’三个点’跳转至ContactsInfo:

此Activity被调用,会传入对应的联系人对象在数据库中的id。
初始化一些控件,为按钮添加点击事件。
根据传入的id从数据库中查询的数据,设置需要显示的姓名电话

(2)删除联系人
AlertDiglog实现删除询问

在ContactsInfo界面中,有删除联系人的按键。

当此按键按下,会弹出一个AlertDialog的提示框,询问是否确认删除该联系人,然后给提示框的yesno按钮设置点击事件。

(1)在yes点击事件中调用MySQLitem类的delete()方法删除指定id的数据库中的数据。删除后调用finish()销毁当前ContactsInfo活动。

(2)在no点击事件中,不做任何操作,结束提示框。

(3)修改联系人

在ContactsInfo界面中,有编辑联系人的按键。

当此按键按下,会跳转到ContactsUpdate活动界面,并且传入一个对应需要修改的联系人在数据库中的id

ContactsUpdate:

初始化一些控件,为按钮添加点击事件。
根据传入的id通过MySQLitem在数据库中查询对应的信息,将信息加载到输入框中等待修改。当用户修改完:

按下保存时:
读取用户在输入框中输入的内容,封装成一个Contacts对象,然后通过MySQLitemupdate()方法将数据库中对应id的数据修改成传入的Contacts对象的数据。

按下取消时:
调用finish()销毁当前Activity

点击’电话图标’跳转至拨号界面

当该图标被点击,跳转到拨号界面,并且将对应联系人对象的电话自动输入到拨号输入框。

MainActivity:

每次MainActivity界面重新显示到手机屏幕时,会调
onRestart(),我们重写此方法,在其中添加初始化ContactsList数据,并且重新加载RecyclerView控件。

(4)查询数据

初始化联系人列表数据,调用MySQLite类中的select()的无参方法,将所有查询到的联系人信息封装成ArrayList对象返回。

MySQLIte:

此类继承SQLiteOpenHelper数据库帮助类,通过获取的读写对象调用execSQL()方法编写SQL语句完成数据库的管理。

并且该类采用单例设计模式中的懒汉式,整个程序只会创建一个对象,其余Activity需要使用该类的功能时,只需要调用getMySQLite()方法即可获得该类对象,该类无法通过构造器创建。

MyAdapter:

基础的自定义适配器,为子项添加了点击事件。

Contacts:

存储联系人信息的类,用于创建联系人对象。

click.xml 和 selector_click.xml

将控件的背景设置为此资源,当控件被点击时会更改背景,让用户获得点击反馈。

click.xml

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

selector_click.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/click"/>
</selector>

总结

整个通讯录管理系统也不会很困难,我是第一次写,也是刚学完SQL的增删改查后想动手实践一下。这个程序是为了复习先前学习的知识,并且实践SQL,并没有什么优化。相对而言是一个简单的学习程序,望支持!文章来源地址https://www.toymoban.com/news/detail-488888.html

到了这里,关于基于java的Android手机通讯录【详细】【完整代码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 获取手机通讯录联系人信息

    近日在项目开发过程中发现,华为手机HarmonyOS 3.0系统,设置隐私 里面可以查看各个应用访问隐私权限的次数,发现应用程序访问手机通讯录的次数异常的高,针对访问通讯录频次高的问题做了研究和优化 问题分析: 分析代码发现只要通过ContentProvider 访问通讯录一次,统计

    2024年02月12日
    浏览(46)
  • Android Studio初学者实例:ContentProvider读取手机通讯录

    该实验是通过ContentProvider读取手机通讯录 知识点包含了RecyclerView控件、UriMatcher、ContentResolver 先看效果,显示手机通讯录  首先是界面的布局代码 activity_main59.xml 其次是RecyclerView的item布局代码,其中使用了CardView是为了方便快捷的弄个圆角储来 main59_item.xml 一个联系人的实体

    2024年02月03日
    浏览(50)
  • Python 基于列表实现的通讯录管理系统(有完整源码)

    目录 通讯录管理系统 PersonInformation类 ContactList类 menu函数 main函数 程序的运行流程 完整代码 运行示例 这是一个基于文本的界面程序,用户可以通过命令行与之交互,它使用了CSV文件来存储和读取联系人信息,这使得数据可以持久化保存。此外,程序还提供了一些基本的输入

    2024年04月15日
    浏览(48)
  • Android之抓取短信,所有应用信息,通讯录,通话记录,手机系统相册图片

    一般我们做金融APP会遇到风控需求,需要获取用户手机短信,手机所有安装应用信息,通讯录,通话记录等功能,接下来我们看看怎么做,一篇文章解决所有! 这里我只需要这些字段,需要更多自己添加 1.kotlin 2.java 1.kotlin 2.Java 1.kotlin 2.Java 这篇文章比较长,懒得分开成几篇

    2024年02月16日
    浏览(42)
  • Android Studio 简易通讯录制作 (Java)

    通讯录首页:  添加联系人页面:  修改联系人: 删除联系人:  程序代码: MainActivity.java MyAdapter.java  DBHelper.java User.java  activity_main.xml dialog.xml  item.xml colors.xml  详细见:https://gitee.com/love1213/Android-Studio-Contacts.git

    2024年02月11日
    浏览(44)
  • 简单步骤:Android studio 内容提供者 - 实现建立手机通讯录界面,读取系统联系人

    提示:本篇文章将会尽量保持精简,同时请诸位敲写代码时保持耐心,三连是最大的支持! 文章目录 前言 一、项目介绍 二、使用步骤 1.创建程序 2.添加 recyclerview-v7 库 3.放置界面控件 4.搭建界面布局 5.封装实体类 6.编写数据适配器 7.实现显示界面数据功能 8.去掉默认标题栏

    2024年02月08日
    浏览(57)
  • python-手机通讯录

    手机通讯录 通讯录是记录了联系人姓名和联系方式的名录,手机通讯录是最常见的通讯录之一,人们可以在通讯录中通过姓名查看相关联系人的联系方式等信息,也可以在其中新增联系人,或修改、删除联系人信息。 本实例要求编写程序,实现具备添加、查看、修改以及删

    2024年02月06日
    浏览(69)
  • 手机通讯录 python

    person_info = [] print(“=” * 20) print(‘欢迎使用通讯录:’) print(“1.添加联系人”) print(“2.查看通讯录”) print(“3.删除联系人”) print(“4.修改联系人信息”) print(“5.查找联系人”) print(“6.退出”) print(“=” * 20) while True: per_dict = {} fun_num = input(‘请输入功能序号:’) if fun_num

    2024年02月06日
    浏览(38)
  • 通讯录管理系统(c/c++)含完整源码~

    hello,大家好!今天小冉给大家分享一个通讯录管理系统。如果要了解细节上的东西大家可以去b站搜索”黑马程序员“的c++课程,老师讲的非常清晰细致,程序大体结构都和课程中的相同,我自己做了一点小小的修改,如果大家在该程序的编程实现上出现什么问题都可以在评

    2024年02月09日
    浏览(38)
  • 通讯录文件如何导入手机简单方法

    今天要和大家分享的是,如何将通讯录文件导入华为手机。最简单的方法是直接通过微信或QQ将通讯录文件传输到手机之上,而不需要使用第三方工具。。 通讯录文件指的是vCard文件,也称为vcf文件。通常是手机和通讯录工具导出的文件。可以很方便地导入到其他手机之上。

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包