【Android】SQLite使用——增删查改
三三要成为安卓糕手
一:SQLite介绍
SQLite是Android提供的本地型、轻量级的关系型数据库。
SQLite的特点
- 轻量级:与其他数据库系统相比,它没有单独的服务器进程,也不需要配置文件。
- 自包含:所有数据都存储在一个文件中,非常便于管理和传输。
- 开源:SQLite 是免费的,并且源代码对开发者开放。
- SQL 支持:支持标准的 SQL 语法,包括 SELECT、INSERT、UPDATE、DELETE 等常用操作。
适合使用 SQLite 的场景有:
- 存储用户数据,比如用户的配置、账号信息等。
- 应用的缓存数据,比如离线数据或历史记录。
- 大量、结构化的数据存储,比如联系人列表或本地消息存储。
使用SQLite
数据库操作,一般包括创建数据库、表格,增删改查几种操作,在 Android 中可以通过 SQLiteOpenHelper 类来管理数据库的创建和更新。
注意:SQLite的建表、增删改查,属于耗时操作,虽然少量的数据操作不会引起主线程卡顿,但还是建议放在后台线程来完成。
二:创建SQLite数据库
1:总代码和分析
public class MySqliteHelper extends SQLiteOpenHelper {//数据库的名字和版本号private static final String DATABASE_NAME = "MyDatabase.db";private static final int DATABASE_VERSION = 1;public MySqliteHelper(@Nullable Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}//第一次创建数据库的时候会调用这个方法,一般会在这里建表@Overridepublic void onCreate(SQLiteDatabase db) {String CREATE_USER_TABLE = "create table user (id integer primary key autoincrement," +"name text not null , age integer not null)";//execute 执行SQL语句db.execSQL(CREATE_USER_TABLE);}//升级数据库,会触发这个方法@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//删除旧表db.execSQL("drop table if exists user");//重新onCreate,建立新表onCreate(db);}
}
-
继承SQLiteOpenHelper,重写onCreate和onUpgreade方法
-
onCreate中创建table表,写好sql语句,exec(execute - 执行)SQL语句;自增主键可以理解成唯一标识符
-
onUpgreade在升级数据库,会触发这个方法
-
DATABASE_NAME指的是数据库文件的名字,版本号1迭代到2,以此类推;用于完成父类构造
三:UI界面
四:增——插入数据
/*** 插入数据*/findViewById(R.id.btn_insert).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(SQLiteActivity.this);//获取写入数据库的对象SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();//创建contentValues对象,往里面放一条数据ContentValues values = new ContentValues();values.put("name",etUserName.getText().toString().trim());values.put("age",etUserAge.getText().toString().trim());//第二个参数表示,当values为null的时候什么也不插入long newRowId = writableDatabase.insert("user", null, values);Log.i(TAG, "onCreate: 插入数据 newRowId : " + newRowId);});
这里的插入数据是需要写数据,所以创建一个写入数据库的对象(mySqliteHelper.getWritableDatabase();)
ContentValues主要作用是封装要插入或更新到数据库(SQLite)中的数据
writableDatabase.insert(“user”, null, values)
- 第一个参数
"user"
:目标表的表名。 - 第二个参数
null
:当values
为空时,指定一个默认填充NULL
的列名(表示若values
为空则不插入记录)。 - 第三个参数
values
:一个ContentValues
对象,存储了要插入的字段名和对应值(键值对形式,如values.put("name", "张三")
)。 long newRowId
:插入成功时,返回新记录的行 ID(SQLite 自动生成的唯一标识);若插入失败(如违反唯一约束),则返回-1
。
效果如下
数据被保存到的这里
这里用的是一款可以打开db数据库文件的软件:Browser for SQLite 自行下载
五:查——查询数据
1:代码
/*** 查询数据*/findViewById(R.id.btn_select).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);//创建可以读取数据库的对象SQLiteDatabase readableDatabase = mySqliteHelper.getReadableDatabase();//创建查询条件Cursor cursor = readableDatabase.query("user",new String[]{"id", "name", "age"},"age > ? and name like ?",new String[]{"30","%释%"},null,null,"age ASC");//orderBy如果为null,表示默认排序。 ASC=升序 DESC=降序ArrayList<User> users = new ArrayList<>();//光标移动到下一行,有数据就返回true,否则falsewhile(cursor.moveToNext()){//获取id这一列的位置,不存在抛出异常,下面同理int idIndex = cursor.getColumnIndexOrThrow("id");int id = cursor.getInt(idIndex);int nameIndex = cursor.getColumnIndexOrThrow("name");String name = cursor.getString(nameIndex);int ageIndex = cursor.getColumnIndexOrThrow("age");int age = cursor.getInt(ageIndex);//循环一次,就拿到一个User的信息User user = new User(id, name, age);//搞个容器,放很多Userusers.add(user);}//释放资源cursor.close();tvMessage.setText(users.toString());Log.i(TAG, "onCreate: users = " + users.toString());});
(1)Cursor创建查询条件
Cursor
可以理解为一个迭代器,用于遍历查询结果。
-
查询
user
表的操作 -
只查询
id
、name
、age
这三个字段 -
查询条件是:
age > 30
并且name
中包含 “释” 字 -
结果按
age
字段升序排列ASC
的全称是Ascending
,意为 “升序”,表示数据按照从小到大的顺序排列。DESC
的全称是Descending
,意为 “降序”,表示数据按照从大到小的顺序排列。
使用完毕后一定要关闭Cursor,以释放相关资源。
(2)遍历表
moveToNext()
相当于判断是否有下一个元素,有就返回true,并移动指针
getColumnIndexOrThrow(“id”),通过id列索引获取,获取当前元素的属性,比如获取第一行的id,返回值就是1
(3)效果
六:改 & 删——修改数据
/*** 更新数据*/findViewById(R.id.btn_update).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name",etUserName.getText().toString().trim());values.put("age",etUserAge.getText().toString().trim());//把名字是释的一行数据更新信息,更新内容包含name和ageint count = writableDatabase.update("user", values, "name = ?", new String[]{"释"});});
/*** 删除数据*/findViewById(R.id.btn_delete).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();//删除age=18的所有数据int count = writableDatabase.delete("user", "age = ?", new String[]{"18"});});
我们把年龄18的人数据全删掉,把name叫“释”的家伙的信息修改为name = Sansan ,age = 22