概述上节完成嘟宝SQLite数据库功能。SQLite 是一个嵌入式关系型数据库管理系统与传统数据库如 MySQL、PostgreSQL不同它不是一个独立的进程而是一个可以直接嵌入到应用程序文件性数据库。是全球部署最广泛的数据库引擎因为它在简单性、可靠性和功能性之间取得了很好的平衡。如果你需要一个轻量级、零配置、可靠的数据存储解决方案SQLite 是非常好的选择。SQLite数据类型不多简单够用。INTEGER数字类型REAL浮点型TEXT文本型BLOB二进制文件类型SQLiteOpenHelper类是Android 用于管理SQLite数据库。包括数据库的创建、数据的增删改查、事物等等。在 Android 中使用原始 SQL 语句操作 SQLite 数据库相比使用 ORM 框架如 Room或 Android 封装的 API有以下显著好处完全的控制权执行复杂查询更高效性能优势明显迁移和维护简单调试和排查问题方便避免 ORM 的陷阱基于原始SQL增删改查表结构:id 主键、自增、不为空dumaName 嘟妈名称dumaId嘟妈身份识别码bindDateTime嘟妈绑定时间核心函数rawQuery 用于原始SQL查询功能execSQL用于原始SQL增删改、表格创建等CursorrawQuery(String sql,String[]selectionArgs)Cursor cursordb.rawQuery(SELECT * FROM users WHERE age ? AND name LIKE ?,newObject[]{18,%张%});rawQuery只要不抛出SQLException 异常代表执行成功他的返回查询结果是Cursor 。selectionArgs是占位符它将Object内的结构分配给SQL语句中的问号。实际生成的SQL语句SELECT*FROM users WHERE age18AND name LIKE18voidexecSQL(String sql,Object[]bindArgs)db.execSQL(INSERT INTO users (name, age) VALUES (?, ?),newObject[]{张三,25});execSQL不返回值只要不抛出SQLException 异常代表执行成功。bindArgs是占位符它将Object内的结构分配给SQL语句中的问号实际生成的语句INSERT INTO users(name,age)VALUES(张三,25)我们可以使用字符串拼接的方式取消占位符的使用将其设置NULL即可或者不传递。事例MyDB类package com.zilong.dubao;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.widget.Toast;public classMyDBextendsSQLiteOpenHelper{publicMyDB(String name,SQLiteDatabase.CursorFactory factory,int version){super(app.getContext(),name,factory,version);}Override public voidonCreate(SQLiteDatabase db){Toast.makeText(app.getContext(),数据库与表创建成功,Toast.LENGTH_SHORT).show();String dumaTabelCREATE TABLE duma (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, dumaName text,dumaId text,bindDateTime INTEGER);db.execSQL(dumaTabel);}Override public voidonUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){}}MainActivity类源码package com.zilong.dubao;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;public classMainActivityextendsAppCompatActivity{private MyDB myDBnewMyDB(dubao.db,null,12);Override protected voidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initBtn();// startService();ImageView qrCodeImageViewfindViewById(R.id.qrCode);uuid unewuuid();String dubaoIdu.getuuid();Log.d(uuid,dubaoId);Bitmap logoBitmapBitmapFactory.decodeResource(getResources(),R.drawable.logo);int foregroundColor.parseColor(#2196F3);// 前景蓝int backgroundColor.WHITE;// 背景白Bitmap qrBitmapQRCodeUtil.ShowQRCode(dubaoId,logoBitmap,0.2f,foreground,background);qrCodeImageView.setImageBitmap(qrBitmap);}private voidinitBtn(){Button createDBBtnfindViewById(R.id.createDB);createDBBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){myDB.getWritableDatabase();}});Button insertBtnfindViewById(R.id.insertDB);insertBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){SQLiteDatabase dbmyDB.getWritableDatabase();String sql;sqlString.format(INSERT INTO duma( \dumaName\, \dumaId\, \bindDateTime\) VALUES ( %s, %s, %d);,嘟妈,f1122aeb-f2b0-400d-9919-eddd2eaebaa2,System.currentTimeMillis());Log.d(mqtt,sql);db.execSQL(sql);}});Button updateBtnfindViewById(R.id.updateDB);updateBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){SQLiteDatabase dbmyDB.getWritableDatabase();String sql;sqlString.format(UPDATE duma set dumaName\%s\ WHERE dumaId\%s\,嘟妈2,f1122aeb-f2b0-400d-9919-eddd2eaebaa2);Log.d(mqtt,sql);db.execSQL(sql);}});Button queryBtnfindViewById(R.id.queryDB);queryBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){SQLiteDatabase dbmyDB.getWritableDatabase();Cursor cursordb.rawQuery(SELECT * FROM duma,null);if(cursor.moveToFirst()){do{SuppressLint(Range)String dumaNamecursor.getString(cursor.getColumnIndex(dumaName));SuppressLint(Range)String dumaIdcursor.getString(cursor.getColumnIndex(dumaId));SuppressLint(Range)int bindDateTimecursor.getInt(cursor.getColumnIndex(bindDateTime));Toast.makeText(MainActivity.this,dumaName,Toast.LENGTH_SHORT).show();}while(cursor.moveToNext());}cursor.close();}});Button delBtnfindViewById(R.id.delDB);delBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){SQLiteDatabase dbmyDB.getWritableDatabase();String sql;sqlString.format(DELETE FROM duma WHERE dumaId\%s\,f1122aeb-f2b0-400d-9919-eddd2eaebaa2);Log.d(mqtt,sql);db.execSQL(sql);}});}private voidstartService(){Intent inewIntent(this,MyService.class);startForegroundService(i);}}运行实例查看结果点击创建数据库两次但实际onCreate只调用一次创建。分别操作插入数据-查询数据更新数据-查询数据删除数据-查询数据SQLite 事务在 Android SQLite 中事务是一组数据库操作的逻辑单元要么全部执行成功要么全部失败回滚确保数据的一致性和完整性。事务的基本特性ACID原子性事务中的所有操作要么全部成功要么全部失败一致性事务执行前后数据库保持完整状态隔离性并发事务之间互不干扰持久性事务提交后数据永久保存package com.zilong.dubao;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;public classMainActivityextendsAppCompatActivity{private MyDB myDBnewMyDB(dubao.db,null,12);Override protected voidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initBtn();}private voidinitBtn(){Button rollupBtnfindViewById(R.id.rollupDB);rollupBtn.setOnClickListener(newView.OnClickListener(){Override public voidonClick(View v){SQLiteDatabase dbmyDB.getWritableDatabase();db.beginTransaction();try{// 执行多个数据库操作for(int i0;i3;i){String sql;sqlString.format(INSERT INTO duma( \dumaName\, \dumaId\, \bindDateTime\) VALUES ( %s, %s, %d);,嘟妈i,f1122aeb-f2b0-400d-9919-eddd2eaebaa2,System.currentTimeMillis());db.execSQL(sql);if(i1){thrownewException(失败);}}db.setTransactionSuccessful();db.close();}catch(Exception e){// 发生异常自动回滚e.printStackTrace();db.endTransaction();db.close();Toast.makeText(MainActivity.this,发生异常自动回滚,Toast.LENGTH_SHORT).show();}}});}}运行效果查看