您的位置:首页 > 数据库

安卓案例:利用SQLiteDatabase操作数据库与表

2018-03-06 13:51 519 查看
安卓案例:利用SQLiteDatabase操作数据库与表
一、SQLite简介SQLite是D. Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。SQLite的整体结构图如下:


值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。
SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。
概括来讲,SQLite支持NULLINTEGERREALTEXTBLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
二、案例运行效果


三、实现步骤
1、创建安卓应用SQLiteDatabaseDemo


2、准备背景图片background.jpg,拷贝到res下的mipmap目录里


3、主布局资源文件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="@mipmap/background"
android:gravity="center"
android:orientation="vertical"
tools:context="net.hw.sqlite_database_demo.MainActivity">

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

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

<Button
android:id="@+id/btn_add_record"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:onClick="doAddRecord"
android:text="@string/add_record" />

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

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

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

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

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

</LinearLayout>4、字符串资源文件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>
<string name="action_settings">设置</string>
</resources>5、主界面类MainActivity


(1)定义常量和变量
package net.hw.sqlite_database_demo;

import android.app.Activity;
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 Activity {
/**
* 数据库名
*/
private final String DB_NAME = "student.db";
/**
* 表名
*/
private final String TABLE_NAME = "student";
/**
* 文件访问模式
*/
private final int MODE = Context.MODE_PRIVATE;
/**
* SQLite数据库
*/
private SQLiteDatabase db;
/**
* 学号
*/
private int id;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
}
}
(2)创建或打开数据库按钮单击事件处理代码
/**
* 创建或打开数据库
*
* @param view
*/
public void doCreateOrOpenDB(View view) {
// 判断是否有数据库
if (databaseList().length == 0) {
// 创建数据库
db = openOrCreateDatabase(DB_NAME, MODE, null);
// 提示用户创建数据库成功
Toast.makeText(this, "恭喜,数据库【" + DB_NAME + "】创建成功!", Toast.LENGTH_SHORT).show();
} else {
// 打开数据库
db = openOrCreateDatabase(DB_NAME, MODE, null);
// 提示用户打开数据库成功
Toast.makeText(this, "恭喜,数据库【" + DB_NAME + "】打开成功!", Toast.LENGTH_SHORT).show();
}
}
运行程序,结果如下:


第一次单击【创建或打开数据库】按钮:


第二次单击【创建或打开数据库】按钮:


(3)创建判断表是否存在的方法isTableExisted(String tableName)

/**
* 判断表是否存在
*
* @param tableName
* @return
*/
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});
// 判断游标里是否有记录
return cursor.getCount() > 0;
}(4)创建表按钮单击事件处理代码
/**
* 创建表
*
* @param view
*/
public void doCreateTable(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).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();
}
}
}
}
运行程序,结果如下:


不单击【创建或打开数据库】按钮,直接单击【创建表】按钮:


单击【创建或打开数据库】按钮之后,再单击【创建表】按钮:


此时,再单击【创建表】按钮:


问题:我们创建的student.db数据库在哪里?


将student.db数据库抓到电脑主机上:






可以使用NaviCat来查看student.db这个SQLite数据库:




(5)编写获新记录id的方法getNewId()
/**
* 获取新记录的学号
*
* @param tableName
* @return
*/
private int getNewId(String 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;
}
// 返回新记录的id
return 1;
}
(6)编写添加表记录的方法addRecord()
/**
* 添加表记录
*
* @param view
*/
public void doAddRecord(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).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 == 0 ? "女" : "男");
// 将数据插入表中
long count = db.insert(TABLE_NAME, null, values);
// 判断记录是否添加成功
if (count != -1) {
Toast.makeText(this, "恭喜,表记录添加成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "遗憾,表记录添加失败!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【创建或打开数据库】按钮:




单击10次【添加表记录】按钮:


此时可将数据库student.db抓到电脑主机查看:


可以看到,确实添加了10条记录,单数学号是男生,双数学号是女生。
(7)编写获取总记录数的方法getRecordCount()
/**
* 获取总记录数
*
* @param tableName
* @return
*/
private int getRecordCount(String tableName) {
// 定义SQL字符串
String strSQL = "SELECT * FROM " + tableName;
// 执行SQL,返回游标
Cursor cursor = db.rawQuery(strSQL, null);
// 返回记录数
return cursor.getCount();
}
(8)更新表记录:将第1条记录的姓名改成“张三丰”编写doUpDateRecord()方法
/**
* 更新表记录
* 将第1条记录姓名改成“李晓红”,性别改成“女”
*
* @param view
*/
public void doUpdateRecord(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
}
} else {
// 判断表是否存在
if (isTableExisted(TABLE_NAME)) {
if (getRecordCount(TABLE_NAME) > 0) {
// 创建内容值对象
ContentValues values = new ContentValues();
// 添加数据
values.put("name", "李晓红");
values.put("gender", "女");
// 更新第1条记录
int count = db.update(TABLE_NAME, values, "id = ?", new String[] {"1"});
// 判断是否更新成功
if (count > 0) {
Toast.makeText(this, "恭喜,表记录更新成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "遗憾,表记录更新失败!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "没有表记录可更新,请先添加表记录!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【创建或打开数据库】按钮,然后单击【更新表记录】按钮:


此时,将student.db数据库抓到电脑主机上,利用NaviCat查看student表记录:


(9)编写doDisplayAllRecords()方法
/**
* 显示全部记录
*
* @param view
*/
public void doDisplayAllRecords(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
}
} else {
// 判断表是否存在
if (isTableExisted(TABLE_NAME)) {
// 查询全部表记录,返回游标
Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
// 判断是否有记录
if (cursor.getCount() > 0) {
// 定义字符串生成器
StringBuilder builder = new StringBuilder();
builder.append("全部学生记录\n\n");
// 遍历游标(记录集)
while(cursor.moveToNext()) {
// 获取当前记录信息
String record = cursor.getInt(0) + "\t" + cursor.getString(1) + "\t" + cursor.getString(2);
// 将当前记录追加到字符串生成器
builder.append(record + "\n");
}
// 通过吐司显示
Toast.makeText(this, builder.toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "没有表记录可显示,请先添加表记录!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【创建或打开数据库】按钮,再单击【显示全部表记录】:


(10)编写doDeleteAllRecords()方法
/**
* 删除全部表记录
*
* @param view
*/
public void doDeleteAllRecords(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
}
} else {
// 判断表是否存在
if (isTableExisted(TABLE_NAME)) {
// 查询全部表记录
Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
// 判断是否有表记录
if (cursor.getCount() > 0) {
// 删除全部表记录
int count = db.delete(TABLE_NAME, null, null);
// 判断是否删除成功
if (count > 0) {
Toast.makeText(this, "恭喜,全部表记录删除成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "遗憾,全部表记录删除失败!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "没有表记录可删除,请先添加表记录!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【创建或打开数据库】按钮,再单击【删除全部表记录】:


此时,再单击【删除全部表记录】:


再单击【显示全部表记录】:


再单击【更新表记录】按钮:


(11)编写doDeleteTable()方法
/**
* 删除表
*
* @param view
*/
public void doDeleteTable(View view) {
// 判断数据库对象是否为空
if (db == null) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "请创建数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "请打开数据库【" + DB_NAME + "】。", Toast.LENGTH_SHORT).show();
}
} else {
// 判断表是否存在
if (isTableExisted(TABLE_NAME)) {
// 定义SQL字符串
String strSQL = "DROP TABLE " + TABLE_NAME;
try {
// 执行SQL,删除表
db.execSQL(strSQL);
Toast.makeText(this, "恭喜,表【" + TABLE_NAME + "】删除成功!", Toast.LENGTH_SHORT).show();
} catch (SQLException e) {
Toast.makeText(this, "遗憾,表【" + TABLE_NAME + "】删除失败!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "表【" + TABLE_NAME + "】不存在,请先创建!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【创建或打开数据库】按钮,再单击【删除表】按钮:


(12)编写doDeleteDB()方法
/**
* 删除数据库
*
* @param view
*/
public void doDeleteDB(View view) {
// 判断数据库是否存在
if (databaseList().length == 0) {
Toast.makeText(this, "没有数据库可删除!", Toast.LENGTH_SHORT).show();
} else {
// 删除数据库
if (deleteDatabase(DB_NAME)) {
Toast.makeText(this, "恭喜,数据库【" + DB_NAME + "】删除成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "遗憾,数据库【" + DB_NAME + "】删除失败!", Toast.LENGTH_SHORT).show();
}
}
}
运行程序,单击【删除数据库】按钮:


再单击【删除数据库】按钮:


四、课后作业
做一个简单的学生信息管理系统,主要是完成学生记录的增删改查。




五、知识点小结

直接利用SQLiteDatabase来进行数据库与表的操作。(1)Activity对象提供操作数据库的方法:databaseList()openOrCreateDatabase()deleteDatabase()。(2)SQLiteDatabase对象提供了操作数据表的方法:executeSQL(),需要传入一个操作数据标的字符串参数。而rawQuery()方法要返回一个Cursor对象,有点类似于JDBC里的结果集(ResultSet),该对象提供了一些移动记录指针的方法:moveToFirst()、moveToLast、moveToNext()、moveToPrevious()、move()、moveToPosition()。如果我们要遍历游标集,那么我们会利用while循环与moveToNext()方法来处理。(3)SQLiteDatabase还提供了一组对表进行增删改查的方法:insert()、delete()、update()、query()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐