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

文章目录

前言一、基本模块代码(包含UI界面代码)Activity类:(1)主页面MainActivity(2)增加联系人ContactsAdd(3)联系人信息ContactsInfo(4)修改联系人ContactsUpdate

工具类:(1)联系人对象Contacts(2)自定义适配器MyAdapter(3)数据库管理MySQLite

二、实现逻辑1、逻辑执行图2、功能实现ContactsAdd:(1)增加联系人SharedPreferences实现存草稿

RecyclerView:点击'三个点'跳转至ContactsInfo:(2)删除联系人AlertDiglog实现删除询问

(3)修改联系人

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

MainActivity:(4)查询数据

MySQLIte:MyAdapter:Contacts:click.xml 和 selector_click.xml

总结

前言

需要掌握学习的知识点: 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 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() {

@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;

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/recycle_view"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

(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);

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginTop="50dp"

android:layout_marginRight="50dp">

android:id="@+id/name_add_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="姓名:"

android:textSize="35sp" />

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" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginTop="50dp"

android:layout_marginRight="50dp">

android:id="@+id/phone_number_add_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="电话:"

android:textSize="35sp" />

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" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginTop="50dp"

android:layout_marginRight="50dp">

android:id="@+id/add_back_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="返回" />

android:id="@+id/add_temp_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:text="存为草稿" />

android:id="@+id/add_yes_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:text="确认" />

(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);

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginTop="80dp"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginRight="50dp"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="姓名:"

android:textSize="30dp" />

android:id="@+id/name_info_text"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="姓名"

android:textSize="40dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="50dp"

android:text="电话:"

android:textSize="30dp" />

android:id="@+id/phone_number_info_text"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="联系人电话"

android:textSize="30dp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginTop="50dp"

android:layout_marginRight="50dp">

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" />

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" />

android:layout_width="match_parent"

android:layout_height="match_parent">

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" />

(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);

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

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">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="姓名:"

android:textSize="30dp" />

android:id="@+id/name_update_edit"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="待修改的姓名"

android:textSize="40dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="50dp"

android:text="电话:"

android:textSize="30dp" />

android:id="@+id/phone_number_update_edit"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="待修改的电话"

android:textSize="30dp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="50dp"

android:layout_marginTop="50dp"

android:layout_marginRight="50dp">

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" />

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" />

工具类:

(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 {

List 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 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 query() {

db = getWritableDatabase();

Cursor cursor = db.rawQuery("select * from ContactsList", null);

ArrayList 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、逻辑执行图

这是整个通讯录的简单界面跳转逻辑(第一次画这个东西,代码写完了再画图,ԾㅂԾ,,凑合看看),每个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的提示框,询问是否确认删除该联系人,然后给提示框的yes和no按钮设置点击事件。

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

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

(3)修改联系人

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

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

ContactsUpdate:

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

按下保存时: 读取用户在输入框中输入的内容,封装成一个Contacts对象,然后通过MySQLitem的update()方法将数据库中对应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

xmlns:android="http://schemas.android.com/apk/res/android">

selector_click.xml

总结

整个通讯录管理系统也不会很困难,我是第一次写,也是刚学完SQL的增删改查后想动手实践一下。这个程序是为了复习先前学习的知识,并且实践SQL,并没有什么优化。相对而言是一个简单的学习程序,望支持!