安卓学习笔记18 使用SQLite数据库

编程入门 行业动态 更新时间:2024-10-10 17:22:47

安卓<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记18 使用SQLite数据库"/>

安卓学习笔记18 使用SQLite数据库

文章目录

  • 一、使用SQLiteDatabase类操作数据库
    • 1、创建安卓应用
    • 2、准备图片素材
    • 3、字符串资源文件
    • 4、主布局资源文件
    • 5、主界面类实现功能
    • 6、启动应用,查看效果
  • 二、使用SQLiteDatabaseHelper类操作数据库与表
    • 1、创建安卓应用
    • 2、准备图片素材
    • 3、字符串资源文件
    • 4、主布局资源文件
    • 5、创建自定义数据库助手类
      • (1)构造方法
      • (2)重写onCreate方法
      • (3)重写onUpgrade方法
      • (4)编写query方法
      • (5)编写delete方法
      • (6)编写update方法
      • (7)编写insert方法
      • (8)查看数据库助手类完整代码
    • 7、启动应用,查看效果

一、使用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=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:gravity="center"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid: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" /><Buttonandroid: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数据库对象@Overrideprotected 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、启动应用,查看效果

二、使用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=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical"android:padding="10dp"tools:context=".MainActivity"><ListViewandroid: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月20日*/
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*/@Overridepublic void onCreate(SQLiteDatabase db) {// 创建数据表createTable(db, TABLE_NAME);// 添加表记录addRecords(db, TABLE_NAME);}@Overridepublic 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; // 当前列表项位置@Overrideprotected 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() {@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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() {@Overridepublic 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、启动应用,查看效果

更多推荐

安卓学习笔记18 使用SQLite数据库

本文发布于:2024-02-06 20:46:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1751338.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   数据库   SQLite

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!