1. 涉及到的技术点
- 数据库SQLite的使用
- 列表控件ListView的使用
- 适配器BaseAdapter的使用
- 线性布局LinearLayoutCompat的使用
2. 开发环境
- 开发工具:AndroidStudio
- 开发语言:java
- jdk版本:8.0+以上
3. 需求分析
- 首选项目需要具备对联系人增,删,改,查的功能
- 提供一个可以添加联系人的页面,让用户可以直接操作UI界面,从而可以快速的添加联系人
- 用户长按点击某个联系人,可以实现拨打电话或者删除的功能
- 用户点击某个联系人,可以实现修改联系人的信息
- 联系人的信息,应该具备app退出之后,数据不能消失,所以需要使用数据库SQLite来实现数据存储
4. 代码实现过程
- 搭建用户可以添加联系人的页面 activity_add_student_info.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".AddStudentInfoActivity">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/purple_500"
app:title="新建通讯录"
app:navigationIcon="@mipmap/img_back"
app:titleTextColor="@color/white">
</androidx.appcompat.widget.Toolbar>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="50dp"
android:layout_marginRight="20dp"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="50dp"
app:cardBackgroundColor="#f5f5f5"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="姓名:"
android:textColor="#222222" />
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入姓名"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
app:cardBackgroundColor="#f5f5f5"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="手机号:"
android:textColor="#222222" />
<EditText
android:id="@+id/et_mobile"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入手机号"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
app:cardBackgroundColor="#f5f5f5"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="班级:"
android:textColor="#222222" />
<EditText
android:id="@+id/et_class_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:background="@null"
android:hint="请输入班级"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="30dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="4dp"
app:cardElevation="0dp">
<TextView
android:id="@+id/create"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/purple_500"
android:gravity="center"
android:text="新建"
android:textColor="@color/white" />
</androidx.cardview.widget.CardView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</RelativeLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
对应的效果图如下所示:
-
创建数据库并创建student_table表
1. 写一个类继承SQLiteOpenHelper 2. 在onCreate()中创建student_table表,并指定表的主键_id为自增长
-
建表的sql语句
//创建用户表
db.execSQL("create table student_table(_id integer primary key autoincrement, " +
"username text," + //用户名
"mobile text," + //手机号
"class_name text" + //班级
")");
- 添加讯录学生信息
public int addUserInfo(String username, String mobile, String class_name) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", username);
values.put("mobile", mobile);
values.put("class_name", class_name);
String nullColumnHack = "values(null,?,?,?)";
//执行
int insert = (int) db.insert("student_table", nullColumnHack, values);
db.close();
return insert;
}
- 查询讯录学生信息
@SuppressLint("Range")
public List<StudentInfo> queryListStudent() {
List<StudentInfo> list = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase();
String sql = "select _id,username,mobile,class_name from student_table";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("username"));
String mobile = cursor.getString(cursor.getColumnIndex("mobile"));
String class_name = cursor.getString(cursor.getColumnIndex("class_name"));
list.add(new StudentInfo(_id, name, mobile, class_name));
}
return list;
}
- 编辑通讯录学生信息
public int editInfo(StudentInfo studentInfo) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
// 填充占位符
ContentValues values = new ContentValues();
values.put("username", studentInfo.getUsername());
values.put("mobile", studentInfo.getMobile());
values.put("class_name", studentInfo.getClass_name());
// 执行SQL
int update = db.update("student_table", values, " _id=?", new String[]{studentInfo.get_id()+""});
// 关闭数据库连接
db.close();
return update;
}
- 删除通讯录学生信息
public int delete (int _id) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
// 执行SQL
int delete = db.delete("student_table", " _id=?", new String[]{_id+""});
// 关闭数据库连接
db.close();
return delete;
}
- StudentDb这个代码实现过程
public class StudentDb extends SQLiteOpenHelper {
public static StudentDb sUserInfoDb;
private static final String DB_NAME = "student_info.db";
private static final int VERSION = 1;
public StudentDb(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public synchronized static StudentDb getInstance(Context context) {
if (null == sUserInfoDb) {
sUserInfoDb = new StudentDb(context, DB_NAME, null, VERSION);
}
return sUserInfoDb;
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建用户表
db.execSQL("create table student_table(_id integer primary key autoincrement, " +
"username text," + //用户名
"mobile text," + //手机号
"class_name text" + //班级
")");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
/**
* 添加讯录学生信息
*/
public int addUserInfo(String username, String mobile, String class_name) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", username);
values.put("mobile", mobile);
values.put("class_name", class_name);
String nullColumnHack = "values(null,?,?,?)";
//执行
int insert = (int) db.insert("student_table", nullColumnHack, values);
db.close();
return insert;
}
/**
* 查询讯录学生信息
*/
@SuppressLint("Range")
public List<StudentInfo> queryListStudent() {
List<StudentInfo> list = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase();
String sql = "select _id,username,mobile,class_name from student_table";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("username"));
String mobile = cursor.getString(cursor.getColumnIndex("mobile"));
String class_name = cursor.getString(cursor.getColumnIndex("class_name"));
list.add(new StudentInfo(_id, name, mobile, class_name));
}
return list;
}
/**
* 编辑通讯录学生信息
*/
public int editInfo(StudentInfo studentInfo) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
// 填充占位符
ContentValues values = new ContentValues();
values.put("username", studentInfo.getUsername());
values.put("mobile", studentInfo.getMobile());
values.put("class_name", studentInfo.getClass_name());
// 执行SQL
int update = db.update("student_table", values, " _id=?", new String[]{studentInfo.get_id()+""});
// 关闭数据库连接
db.close();
return update;
}
/**
*删除通讯录学生信息
*/
public int delete (int _id) {
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
// 执行SQL
int delete = db.delete("student_table", " _id=?", new String[]{_id+""});
// 关闭数据库连接
db.close();
return delete;
}
}
通过对数据库的创建和建表的实现,已经实现了增,删,改,查的sql语句
这一集,我们把准备工作已经做好了,添加通讯录的页面已经有了,对应的添加sql语句也创建好了,下一集,具体去实现 将联系人信息添加到数据库中
5. 运行效果图
6. 资料学习
1. 数据存储与访问之——初见SQLite数据库: https://www.runoob.com/w3cnote/android-tutorial-sqlite-intro.html