提示:代码在基本模块中,教程纯文字,推荐两个屏幕一边看代码一边看教程
简易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、逻辑执行图
这是整个通讯录的简单界面跳转逻辑(第一次画这个东西,代码写完了再画图,ԾㅂԾ,,凑合看看),每个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
<?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文章来源:https://www.toymoban.com/news/detail-488888.html
<?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模板网!