使用SQLite数据库

使用SQLiteDatabase类操作数据库

1、创建安卓应用

基于Empty Activity模板创建安卓应用 - CreateDeleteDB
请添加图片描述
单击【Finish】按钮请添加图片描述

2、准备图片素材

将背景图片拷贝到drawable目录
请添加图片描述

3、字符串资源文件

字符串资源文件 - strings.xml
请添加图片描述

<resources>
    <string name="app_name">创建和删除数据库</string>
    <string name="create_db">创建数据库</string>
    <string name="delete_db">删除数据库</string>
</resources>

4、主布局资源文件

主布局资源文件 - activity_main.xml\
请添加图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_create_db"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:onClick="doCreateDB"
        android:text="@string/create_db"
        android:textSize="20dp" />

    <Button
        android:id="@+id/btn_delete_db"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:onClick="doDeleteDB"
        android:text="@string/delete_db"
        android:textSize="20dp" />
</LinearLayout>

查看预览效果请添加图片描述

5、主界面类实现功能

主界面类 - MainActivity请添加图片描述
声明常量和变量请添加图片描述
获取应用当期数据库个数请添加图片描述
编写代码创建数据库请添加图片描述
编写代码删除数据库
请添加图片描述
查看完整源代码

package net.hw.create_delete_db;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
    

    private static final String DB_NAME_PREFIX = "student"; // 数据库名前缀
    private static final int MODE = Context.MODE_PRIVATE; // 文件访问模式
    private int count; // 数据库计时器
    private SQLiteDatabase db; // SQLite数据库对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 获取应用当前数据库个数
        count = databaseList().length;
    }

    /**
     * 创建数据库
     * 数据库位置:/data/data/net.hw.create_delete_db/databases
     * @param view
     */
    public void doCreateDB(View view) {
    
    
        // 数据库计数器累加
        count++;
        // 定义数据库名
        String dbname = DB_NAME_PREFIX + count + ".db";
        try {
    
    
            // 打开或创建数据库
            db = openOrCreateDatabase(dbname, MODE, null);
            // 提示用户创建成功
            Toast.makeText(this, "恭喜,数据库【" + dbname + "】创建成功!", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
    
    
            // 提示用户创建失败
            Toast.makeText(this, "遗憾,数据库【" + dbname + "】创建失败!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 删除数据库(删除全部数据库)
     *
     * @param view
     */
    public void doDeleteDB(View view) {
    
    
        // 获取数据库名数组
        String[] dbnames = databaseList();
        // 判断是否有数据库可删除
        if (dbnames.length > 0) {
    
    
            // 遍历数组,按名称删除数据库
            for (String dbname: dbnames) {
    
    
                // 删除数据库
                deleteDatabase(dbname);
            }
            // 数据库计数器归零
            count = 0;
            // 提示用户删除成功
            Toast.makeText(this, "恭喜,数据库全部被删除!", Toast.LENGTH_SHORT).show();
        } else {
    
    
            // 提示用户没有数据库可删除
            Toast.makeText(this, "遗憾,没有数据库可删除!", Toast.LENGTH_SHORT).show();
        }
    }
}

6、启动应用,查看效果

创建5个数据库,然后全部删除,最后又创建了三个数据库
请添加图片描述

使用SQLiteDatabase类操作数据表

1、创建安卓应用

基于Empty Activity模板创建安卓应用 - OperateTable
请添加图片描述
单击【Finish】按钮请添加图片描述

2、准备背景图片

将背景图片拷贝到drawable目录请添加图片描述

扫描二维码关注公众号,回复: 15339950 查看本文章

3、字符串资源文件

字符串资源文件 - strings.xml请添加图片描述

<resources>
    <string name="app_name">利用SQLiteDatabase操作数据表</string>
    <string name="create_or_open_db">创建或打开数据库</string>
    <string name="create_table">创建表</string>
    <string name="add_record">添加表记录</string>
    <string name="update_record">更新表记录</string>
    <string name="display_all_records">显示全部表记录</string>
    <string name="delete_all_records">删除全部表记录</string>
    <string name="delete_table">删除表</string>
    <string name="delete_db">删除数据库</string>
</resources>

4、主布局资源文件

主布局资源文件 - activity_main.xml
请添加图片描述

<?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:background="@drawable/background"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp">

    <Button
        android:id="@+id/btn_create_or_open_db"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doCreateOrOpenDB"
        android:text="@string/create_or_open_db"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_create_table"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doCreateTable"
        android:text="@string/create_table"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btnAddRecord"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doAddRecord"
        android:text="@string/add_record"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_update_record"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doUpdateRecord"
        android:text="@string/update_record"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_display_all_records"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doDisplayAllRecords"
        android:text="@string/display_all_records"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_delete_all_records"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doDeleteAllRecords"
        android:text="@string/delete_all_records"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_delete_table"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doDeleteTable"
        android:text="@string/delete_table"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_delete_db"
        android:layout_width="220dp"
        android:layout_height="wrap_content"
        android:onClick="doDeleteDB"
        android:text="@string/delete_db"
        android:textSize="20sp" />
</LinearLayout>

查看预览效果
请添加图片描述

5、主界面类实现功能

主界面类 - MainActivity
请添加图片描述
声明常量与变量
请添加图片描述

(1)编写代码创建或打开数据库

数据库不存在就创建,存在就打开请添加图片描述
启动应用,查看效果请添加图片描述

(2)编写代码创建表

编写代码判断表是否存在请添加图片描述
编写代码创建表请添加图片描述
启动应用,查看效果
创建表得先打开数据库,创建表成功之后,再次创建表,吐司提示表已经存在
请添加图片描述

(3)编写代码添加表记录

编写代码获取新记录的学号请添加图片描述
编写代码添加表记录请添加图片描述
启动应用,查看效果
添加表记录得先打开数据库,添加6条记录请添加图片描述

(4)编写代码更新表记录

编写代码获取记录数请添加图片描述
请添加图片描述
启动应用,查看效果请添加图片描述

(5)编写代码显示全部表记录

判断表存在后,才能显示全部记录
请添加图片描述
启动应用,查看效果请添加图片描述

(6)编写代码删除全部表记录

判断数据库是否存在,判断表是否存在请添加图片描述
启动应用,查看效果请添加图片描述

(7)编写代码删除表

判断数据库是否存在,判断表是否存在请添加图片描述
启动应用,查看效果请添加图片描述

(8)编写代码删除数据库

判断数据库是否存在请添加图片描述
启动应用,查看效果请添加图片描述

package net.hw.operate_table;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
    

    private final String DB_NAME = "student.db"; // 数据库名
    private final String TABLE_NAME = "student"; // 表名
    private final int MODE = Context.MODE_PRIVATE; // 访问模式
    private SQLiteDatabase db; // SQLite数据库
    private int id; // 学号

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
    }

    /**
     * 创建或打开数据库
     *
     * @param view
     */
    public void doCreateOrOpenDB(View view) {
    
    
        // 判断数据库是否存在
        if (databaseList().length == 0) {
    
    
            // 创建数据库
            db = openOrCreateDatabase(DB_NAME, MODE, null);
            // 提示用户数据库创建成功
            Toast.makeText(this, "恭喜,数据库【" + DB_NAME + "】创建成功!", Toast.LENGTH_LONG).show();
        } else {
    
    
            // 打开数据库
            db = openOrCreateDatabase(DB_NAME, MODE, null);
            // 提示用户数据库打开成功
            Toast.makeText(this, "恭喜,数据库【" + DB_NAME + "】打开成功!", Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 判断表是否存在
     *
     * @param tableName
     * @return true 表存在;false 表不存在
     */
    private boolean isTableExisted(String tableName) {
    
    
        // 定义SQL字符串
        String strSQL = "SELECT * FROM sqlite_master WHERE type = ? AND name = ?";
        // 执行SQL查询,返回游标
        Cursor cursor = db.rawQuery(strSQL, new String[]{
    
    "table", tableName});
        // 判断游标里是否有记录
        if (cursor.getCount() > 0) {
    
    
            return true;
        } else {
    
    
            return false;
        }
    }

    /**
     * 创建表
     *
     * @param view
     */
    public void doCreateTable(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 弹出吐司提示用户表已存在
                Toast.makeText(this, "表【" + TABLE_NAME + "】已经存在!", Toast.LENGTH_LONG).show();
            } else {
    
    
                try {
    
    
                    // 定义SQL字符串
                    String strSQL = "CREATE TABLE " + TABLE_NAME + "(id integer, name text, gender text)";
                    // 执行SQL语句
                    db.execSQL(strSQL);
                    // 提示用户创建表成功
                    Toast.makeText(this, "创建表成功!", Toast.LENGTH_LONG).show();
                } catch (SQLException e) {
    
    
                    // 提示用户创建表失败
                    Toast.makeText(this, "创建表失败!", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    /**
     * 获取新记录的学号
     *
     * @param tableName
     * @return
     */
    private int getNewId(String tableName) {
    
    
        // 判断表是否存在
        if (isTableExisted(tableName)) {
    
    
            // 查询全部表记录,返回游标
            Cursor cursor = db.query(tableName, null, null,
                    null, null, null, null);
            // 移到最后一条记录
            if (cursor.moveToLast()) {
    
    
                // 获取最后一条记录的id
                int id = cursor.getInt(0);
                // 返回新记录的id
                return id + 1;
            }
        }
        return 1;
    }

    /**
     * 添加表记录
     *
     * @param view
     */
    public void doAddRecord(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 获取新记录的学号
                id = getNewId(TABLE_NAME);
                // 创建内容值对象
                ContentValues values = new ContentValues();
                // 以键值对方式添加字段数据
                values.put("id", id);
                values.put("name", "学生" + id);
                values.put("gender", id % 2 == 1 ? "男" : "女");
                // 将数据插入表中
                long count = db.insert(TABLE_NAME, null, values);
                if (count != -1) {
    
    
                    // 弹出吐司提示用户添加成功
                    Toast.makeText(this, "恭喜,表记录添加成功!", Toast.LENGTH_LONG).show();
                } else {
    
    
                    // 弹出吐司提示用户添加失败
                    Toast.makeText(this, "恭喜,表记录添加失败!", Toast.LENGTH_LONG).show();
                }
            } else {
    
    
                // 提示用户先创建表
                Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 返回表记录数
     *
     * @param tableName
     * @return 表记录数
     */
    private int getRecordCount(String tableName) {
    
    
        // 定义SQL字符串
        String strSQL = "SELECT * FROM " + tableName;
        // 执行SQL,返回游标
        Cursor cursor = db.rawQuery(strSQL, null);
        // 返回记录数
        return cursor.getCount();
    }

    /**
     * 更新表记录
     *
     * @param view
     */
    public void doUpdateRecord(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 判断是否有表记录
                if (getRecordCount(TABLE_NAME) > 0) {
    
    
                    // 定义SQL字符串
                    String strSQL = "UPDATE " + TABLE_NAME + " SET name = ?, gender = ? WHERE id = ?";
                    try {
    
    
                        // 执行SQL,返回更新表记录数
                        db.execSQL(strSQL, new Object[]{
    
    "张晓芸", "女", 1});
                        // 提示用户更新记录成功
                        Toast.makeText(this, "恭喜,表记录更新成功!", Toast.LENGTH_LONG).show();
                    } catch (SQLException e) {
    
    
                        // 提示用户更新记录失败
                        Toast.makeText(this, "遗憾,表记录更新失败!", Toast.LENGTH_LONG).show();
                    }
                } else {
    
    
                    // 弹出吐司提示用户没有表记录
                    Toast.makeText(this, "没有表记录可更新,请先添加表记录!", Toast.LENGTH_LONG).show();
                }
            } else {
    
    
                // 提示用户先创建表
                Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 显示全部表记录
     *
     * @param view
     */
    public void doDisplayAllRecords(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 判断表里是否有记录
                if (getRecordCount(TABLE_NAME) > 0) {
    
    
                    // 定义SQL字符串
                    String strSQL = "SELECT * FROM " + TABLE_NAME;
                    // 执行SQL,返回游标
                    Cursor cursor = db.query(TABLE_NAME, null, null,
                            null, null, null, null);
                    // 定义字符串生成器
                    StringBuilder builder = new StringBuilder();
                    // 遍历游标对象(记录集)
                    while (cursor.moveToNext()) {
    
    
                        // 将每条记录信息组合之后添加到字符串生成器
                        builder.append(cursor.getInt(0) + " "
                                + cursor.getString(1) + " "
                                + cursor.getString(2) + " ");
                    }
                    // 弹出吐司显示全部学生记录
                    Toast.makeText(this, "全部表记录\n" + builder.toString(),
                            Toast.LENGTH_LONG).show();
                } else {
    
    
                    // 弹出吐司提示用户没有表记录
                    Toast.makeText(this, "没有表记录可显示,请先添加表记录!",
                            Toast.LENGTH_LONG).show();
                }
            } else {
    
    
                // 提示用户先创建表
                Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!",
                        Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 删除全部表记录(三个层面的判断)
     *
     * @param view
     */
    public void doDeleteAllRecords(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 判断是否有表记录
                if (getRecordCount(TABLE_NAME) > 0) {
    
    
                    // 定义SQL字符串
                    String strSQL = "DELETE FROM " + TABLE_NAME;
                    try {
    
    
                        // 执行SQL,删除表记录
                        db.execSQL(strSQL);
                        // 提示用户删除表记录成功
                        Toast.makeText(this, "全部表记录已删除!", Toast.LENGTH_LONG).show();
                    } catch (SQLException e) {
    
    
                        // 提示用户删除表记录失败
                        Toast.makeText(this, "删除表记录失败!", Toast.LENGTH_LONG).show();
                    }
                } else {
    
    
                    // 弹出吐司提示用户没有表记录
                    Toast.makeText(this, "没有表记录可删除,请先添加表记录!",
                            Toast.LENGTH_LONG).show();
                }
            } else {
    
    
                // 提示用户先创建表
                Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!",
                        Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 删除表
     *
     * @param view
     */
    public void doDeleteTable(View view) {
    
    
        // 判断数据库对象是否为空
        if (db == null) {
    
    
            // 判断数据库是否存在
            if (databaseList().length == 0) {
    
    
                Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            } else {
    
    
                Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。",
                        Toast.LENGTH_LONG).show();
            }
        } else {
    
    
            // 判断表是否存在
            if (isTableExisted(TABLE_NAME)) {
    
    
                // 定义SQL字符串
                String strSQL = "DROP TABLE " + TABLE_NAME;
                try {
    
    
                    // 执行SQL,删除表
                    db.execSQL(strSQL);
                    // 提示用户表删除成功
                    Toast.makeText(this, "表删除成功!", Toast.LENGTH_LONG).show();
                } catch (SQLException e) {
    
    
                    // 提示用户表删除失败
                    Toast.makeText(this, "表删除失败!", Toast.LENGTH_LONG).show();
                }
            } else {
    
    
                // 提示用户先创建表
                Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!",
                        Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 删除数据库
     *
     * @param view
     */
    public void doDeleteDB(View view) {
    
    
        // 判断数据库是否存在
        if (databaseList().length == 0) {
    
    
            // 提示用户没有数据库
            Toast.makeText(this, "没有数据库可删除!", Toast.LENGTH_LONG).show();
        } else {
    
    
            // 判断数据库删除是否成功
            if (deleteDatabase(DB_NAME)) {
    
    
                // 提示用户删除成功
                Toast.makeText(this, "数据库【" + DB_NAME + "】删除成功!",
                        Toast.LENGTH_LONG).show();
            } else {
    
    
                // 提示用户删除失败
                Toast.makeText(this, "数据库【" + DB_NAME + "】删除失败!",
                        Toast.LENGTH_LONG).show();
            }
        }
    }
}

使用SQLiteDatabaseHelper类操作数据库与表

1、创建安卓应用

基于Empty Actiivity模板创建安卓应用 - SQLiteContacts请添加图片描述
单击【Finish】按钮
请添加图片描述

2、准备图片素材

将背景图片拷贝到drawable目录请添加图片描述

3、字符串资源文件

字符串资源文件 - strings.xml请添加图片描述

<resources>
    <string name="app_name">联系人(采用SQLite数据库)</string>
</resources>

4、主布局资源文件

主布局资源文件 - activity_main.xml请添加图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv_contact"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

查看预览效果请添加图片描述

5、创建自定义数据库助手类

自定义数据库助手类 - DBHelper请添加图片描述
继承SQLiteOpenHelper类请添加图片描述
声明变量与常量请添加图片描述

(1)构造方法

创建单参构造方法 - DBHelper(Context context)请添加图片描述

(2)重写onCreate方法

编写createTable()方法
请添加图片描述
编写addRecords()方法请添加图片描述
重写onCreate()方法,创建数据表并添加表记录请添加图片描述

(3)重写onUpgrade方法

升级数据库时会调用请添加图片描述

(4)编写query方法

对外提供表记录查询服务,返回游标对象请添加图片描述

(5)编写delete方法

对外提供表记录删除服务,返回删除记录数请添加图片描述

(6)编写update方法

对外提供表记录更新服务,返回更新记录数请添加图片描述

(7)编写insert方法

对外提供表记录插入服务,返回插入记录数请添加图片描述

(8)查看数据库助手类完整代码

package net.hw.sqlite_contacts;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

import androidx.annotation.Nullable;

/**
 * 功能:数据库助手类
 * 作者:华卫
 * 日期:2022年12月14日
 */
public class DBHelper extends SQLiteOpenHelper {
    
    

    private Context context; // 上下文环境
    private static final String DB_NAME = "contact.db"; // 数据库名
    private static final int DB_VERSION = 1; // 数据库版本号
    private static final String TABLE_NAME = "contact"; // 表名

    /**
     * 构造方法(上下文、数据库名、游标工厂、数据库版本号)
     *
     * @param context
     */
    public DBHelper(Context context) {
    
    
        super(context, DB_NAME, null, DB_VERSION);
    }

    /**
     * 创建数据表
     *
     * @param db
     * @param tableName
     */
    private void createTable(SQLiteDatabase db, String tableName) {
    
    
        // 定义SQL字符串
        String strSQL = "create table " + tableName
                + "(_id text, name text, gender text, age integer, telephone text)";
        try {
    
    
            // 执行SQL,创建数据表
            db.execSQL(strSQL);
        } catch (SQLException e) {
    
    
            Toast.makeText(context, "遗憾,建表失败!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 添加表记录
     *
     * @param db
     * @param tableName
     */
    private void addRecords(SQLiteDatabase db, String tableName) {
    
    
        // 创建内容值对象
        ContentValues values = new ContentValues();

        // 将第1条记录信息放入内容值对象
        values.put("_id", "2021001");
        values.put("name", "李小文");
        values.put("gender", "男");
        values.put("age", 19);
        values.put("telephone", "15878786780");
        // 利用数据库对象的插入方法,插入第1条记录
        db.insert(tableName, null, values);

        // 将第2条记录信息放入内容值对象
        values.put("_id", "2021002");
        values.put("name", "韩玉玲");
        values.put("gender", "女");
        values.put("age", 20);
        values.put("telephone", "15845678907");
        // 利用数据库对象的插入方法,插入第2条记录
        db.insert(tableName, null, values);

        // 将第3条记录信息放入内容值对象
        values.put("_id", "2021003");
        values.put("name", "唐语涵");
        values.put("gender", "女");
        values.put("age", 18);
        values.put("telephone", "13978789089");
        // 利用数据库对象的插入方法,插入第3条记录
        db.insert(tableName, null, values);

        // 将第4条记录信息放入内容值对象
        values.put("_id", "2021004");
        values.put("name", "董翔宇");
        values.put("gender", "男");
        values.put("age", 20);
        values.put("telephone", "15823234567");
        // 利用数据库对象的插入方法,插入第4条记录
        db.insert(tableName, null, values);

        // 将第5条记录信息放入内容值对象
        values.put("_id", "2021005");
        values.put("name", "郑文佳");
        values.put("gender", "女");
        values.put("age", 18);
        values.put("telephone", "13978781234");
        // 利用数据库对象的插入方法,插入第5条记录
        db.insert(tableName, null, values);

        // 将第6条记录信息放入内容值对象
        values.put("_id", "2021006");
        values.put("name", "伍子胥");
        values.put("gender", "男");
        values.put("age", 20);
        values.put("telephone", "15878786780");
        // 利用数据库对象的插入方法,插入第6条记录
        db.insert(tableName, null, values);

        // 将第7条记录信息放入内容值对象
        values.put("_id", "2021007");
        values.put("name", "南怀瑾");
        values.put("gender", "男");
        values.put("age", 18);
        values.put("telephone", "13956567862");
        // 利用数据库对象的插入方法,插入第7条记录
        db.insert(tableName, null, values);

        // 将第8条记录信息放入内容值对象
        values.put("_id", "2021008");
        values.put("name", "李文华");
        values.put("gender", "女");
        values.put("age", 18);
        values.put("telephone", "15956567845");
        // 利用数据库对象的插入方法,插入第8条记录
        db.insert(tableName, null, values);

        // 将第9条记录信息放入内容值对象
        values.put("_id", "2021009");
        values.put("name", "吴文渊");
        values.put("gender", "男");
        values.put("age", 20);
        values.put("telephone", "13978784560");
        // 利用数据库对象的插入方法,插入第8条记录
        db.insert(tableName, null, values);

        // 将第10条记录信息放入内容值对象
        values.put("_id", "2021010");
        values.put("name", "陈燕文");
        values.put("gender", "女");
        values.put("age", 18);
        values.put("telephone", "15890903456");
        // 利用数据库对象的插入方法,插入第10条记录
        db.insert(tableName, null, values);
    }

    /**
     * 创建回调方法,只有当数据库不存在时才会被调用
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
    
    
        // 创建数据表
        createTable(db, TABLE_NAME);
        // 添加表记录
        addRecords(db, TABLE_NAME);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    
        // 暂时不升级,不需要写代码
    }

    /**
     * 查询方法
     *
     * @param tableName
     * @param columns
     * @param selection
     * @param selectionArgs
     * @return 游标对象
     */
    public Cursor query(String tableName, String[] columns,
                        String selection, String[] selectionArgs) {
    
    
        // 获取只读数据库
        SQLiteDatabase db = getReadableDatabase();
        // 执行数据库查询方法,返回游标对象
        return db.query(tableName, columns, selection, selectionArgs,
                null, null, null, null);
    }

    /**
     * 删除方法
     *
     * @param tableName
     * @param whereClause
     * @param whereArgs
     * @return 删除记录数
     */
    public int delete(String tableName, String whereClause, String[] whereArgs) {
    
    
        // 获取可写数据库
        SQLiteDatabase db = getWritableDatabase();
        // 执行数据库删除方法,返回删除记录数
        return db.delete(tableName, whereClause, whereArgs);
    }

    /**
     * 更新方法
     *
     * @param tableName
     * @param values
     * @param whereClause
     * @param whereArgs
     * @return 更新记录数
     */
    public int update(String tableName, ContentValues values,
                      String whereClause, String[] whereArgs) {
    
    
        // 获取可写数据库
        SQLiteDatabase db = getWritableDatabase();
        // 执行数据库更新方法,返回更新记录数
        return db.update(tableName, values, whereClause, whereArgs);
    }

    /**
     * 插入方法
     *
     * @param tableName
     * @param values
     * @return 插入记录数
     */
    public long insert(String tableName, ContentValues values) {
    
    
        // 获取可写数据库
        SQLiteDatabase db = getWritableDatabase();
        // 执行数据库插入方法,返回插入记录数
        return db.insert(tableName, null, values);
    }
}

6、主界面类实现功能

主界面类 - MainActivity请添加图片描述
声明变量与常量请添加图片描述
通过资源标识符获取控件实例请添加图片描述
实例化数据库助手请添加图片描述
查询全部联系人,返回游标,作为数据源请添加图片描述
创建简单游标适配器请添加图片描述
给列表控件设置适配器请添加图片描述

给列表控件注册监听器请添加图片描述
给列表控件添加上下文菜单请添加图片描述
创建上下文菜单请添加图片描述
上下文菜单项选择事件处理请添加图片描述
查看主界面完整源代码

package net.hw.sqlite_contacts;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    
    

    private static final int EDIT_MENU_ITEM = 1; // 编辑菜单项
    private static final int DELETE_MENU_ITEM = 2; // 删除菜单项
    private ListView lvContact; // 联系人列表控件
    private SimpleCursorAdapter adapter; // 简单游标适配器
    private Cursor cursor; // 游标(数据源)
    private DBHelper dbHelper; // 数据库助手
    private int position; // 当前列表项位置

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过资源标识符获取控件实例
        lvContact = findViewById(R.id.lv_contact);

        // 实例化数据库助手
        dbHelper = new DBHelper(this);

        // 查询全部联系人,返回游标,作为数据源
        cursor = dbHelper.query("contact",
                null, null, null);

        // 创建简单游标适配器
        adapter = new SimpleCursorAdapter(
                this, // 参数1:上下文
                android.R.layout.simple_expandable_list_item_2, // 参数2:列表项模板
                cursor, // 参数3:游标(数据源)
                new String[]{
    
    "name", "telephone"}, // 参数4:字段列表
                new int[]{
    
    android.R.id.text1, android.R.id.text2}, // 参数5:控件标识列表
                SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER // 参数6:简单游标适配标识
        );

        // 给列表控件设置适配器
        lvContact.setAdapter(adapter);

        // 给列表控件注册监听器
        lvContact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
    
                // 将游标指针定位到选定记录
                cursor.moveToPosition(position);

                // 获取游标当前记录各个字段值
                String _id = cursor.getString(0);
                String name = cursor.getString(1);
                String gender = cursor.getString(2);
                int age = cursor.getInt(3);
                String telephone = cursor.getString(4);

                // 创建字符串生成器
                StringBuilder builder = new StringBuilder();
                // 将各个字段值添加到字符串生成器中
                builder.append("\n\n")
                        .append("编号:" + _id + "\n")
                        .append("姓名:" + name + "\n")
                        .append("性别:" + gender + "\n")
                        .append("年龄:" + age + "\n")
                        .append("电话:" + telephone + "\n");

                // 生成当前联系人记录信息
                String contactInfo = builder.toString();

                // 通过警告对话框显示当前联系人详情
                AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(
                        MainActivity.this);
                dialogBuilder.setTitle("联系人详情")
                        .setIcon(getResources().getDrawable(
                                R.mipmap.ic_launcher))
                        .setMessage(contactInfo)
                        .setCancelable(false)
                        .setPositiveButton("确定",
                                new DialogInterface.OnClickListener() {
    
    
                                    public void onClick(DialogInterface dialog, int id) {
    
    
                                        //finish();
                                    }
                                })
                        .create()
                        .show();
            }
        });

        // 给列表控件注册上下文菜单
        registerForContextMenu(lvContact);
    }

    /**
     * 创建上下文菜单
     *
     * @param menu
     * @param v
     * @param menuInfo
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    
    
        super.onCreateContextMenu(menu, v, menuInfo);
        // 获取适配器上下文菜单信息
        AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;

        // 通过适配器上下文菜单获取当前位置
        position = acmi.position;
        // 将游标指针移到用户指定位置
        cursor.moveToPosition(position);
        // 获取当前联系人姓名
        String name = cursor.getString(1);

        // 创建上下文菜单项
        menu.add(1, EDIT_MENU_ITEM, 1, "编辑【" + name + "】记录");
        menu.add(1, DELETE_MENU_ITEM, 2, "删除【" + name + "】记录");
        // 设置上下文菜单标题行
        menu.setHeaderTitle("表记录操作");
    }

    /**
     * 上下文菜单项选择事件处理
     *
     * @param item
     * @return
     */
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
    
    
        // 判断用户选择了哪个菜单项
        switch (item.getItemId()) {
    
    
            case EDIT_MENU_ITEM:
                // 课后作业
                Toast.makeText(this, "此功能尚待完成!",
                        Toast.LENGTH_SHORT).show();
                break;
            case DELETE_MENU_ITEM:
                // 创建警告对话框生成器
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                // 设置、创建并显示警告对话框
                builder.setIcon(R.mipmap.ic_launcher) // 设置图标
                        .setTitle("删除表记录") // 设置标题
                        .setMessage("您真要删除当前记录吗?") // 设置消息正文
                        .setPositiveButton("是", new DialogInterface.OnClickListener() {
    
    
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
    
    
                                // 将游标指针移到当前选定位置
                                cursor.moveToPosition(position);
                                // 获取当前联系人的编号
                                String _id = cursor.getString(0);
                                // 按编号删除联系人
                                int count = dbHelper.delete("contact",
                                        "_id = ?", new String[] {
    
    _id});
                                // 判断是否删除成功
                                if (count > 0) {
    
    
                                    // 提示用户删除成功
                                    Toast.makeText(MainActivity.this,
                                            "恭喜,记录删除成功!",
                                            Toast.LENGTH_SHORT).show();
                                    // 刷新列表控件,显示删除之后的联系人记录
                                    cursor.requery();
                                    // 通知列表控件数据源已发生变化
                                    lvContact.deferNotifyDataSetChanged();
                                } else {
    
    
                                    // 提示用户删除失败
                                    Toast.makeText(MainActivity.this,
                                            "遗憾,记录删除失败!",
                                            Toast.LENGTH_SHORT).show();
                                }
                            }
                        }) // 设置肯定按钮
                        .setNegativeButton("否", null) // 设置否定按钮
                        .create() // 创建警告对话框
                        .show(); // 显示警告对话框
                break;
        }
        return true;
    }
}

7、启动应用,查看效果

单击列表项,弹出警告对话框,显示联系人详情;长按列表项,弹出警告对话框,让用户选择编辑和删除当前记录请添加图片描述

猜你喜欢

转载自blog.csdn.net/XLLLXX/article/details/128391311