Android基础(1) -SQLite

最近在看一个项目,项目中数据库部分的实现还是借助了比较原生的api来进行实现。虽然说目前开发中,大家可能都会选择各种ROM框架(例如jetpack中的room)来进行数据库的操作,但是要是遇到一些老项目时,可能还是会用到一些Android提供的原生api。这里就把这部分的知识做一个大致记录吧,也便于自己以后查看。

1.相关类

首先来介绍一下会用到的几个类吧,直接看可能会让人摸不着头脑,可以先查看后面给出的一点代码示例,再回头来看这几个类,可能理解起来就会比较容易了。

SQLiteOpenHelper: 帮助我们创建数据库和管理数据库版本的抽象类。此外,根据官方文档的描述
“此类使 android.content.ContentProvider 实现可以轻松地将数据库的打开和升级推迟到第一次使用,以避免因长时间运行的数据库升级而阻塞应用程序启动。”

SQLiteDatabase: 可以认为是我们要操作的数据库的实体类,增删改查均需要通过此类的实例来调用相关的参数来完成。

Cursor:官方注释:此接口提供对数据库查询返回的结果集的随机读写访问,简单地说,就是能够帮助我们获取查询的结果集,下面是Cursor的一些常用方法

boolean moveToPosition(int position);
boolean moveToFirst();
boolean moveToNext();

int getColumnIndex(String columnName);
String getColumnName(int columnIndex);
String getString(int columnIndex);
int getInt(int columnIndex);

ContentValues
官方文档注释:此类用于存储 ContentResolver 可以处理的一组值。实际开发中,ContentValues常用于SQLite以及四大组件中ContentProvider的增删改相关操作。
ContentValues和HashMap比较相像,他的底层数据结构其实并不复杂,就是一个ArrayMap,它实现了Parcelsbale接口,意味着他是可序列化的类。如果想要更深入的了解,可以阅读相关源码

下面只给出两个ContentValues的最常用方法,其他方法也基本和hashmap中拥有的方法相似,不会难以理解,要使用时直接搜索查询就可以了。

public ContentValues()
public void put(String key, String value)

2. 数据库基本操作

2.1 管理数据库-SQLiteOpenHelper的基础用法

管理数据库的一些操作可以借助SQLiteOpenHelper 类。

继承SQLiteOpenHelper必须实现 两个抽象方法 onCreate() 和 onUpgrade()方法。这两个方法分别用于创建和升级数据库

override fun onCreate(db: SQLiteDatabase) {

}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {

}

创建数据库会用到的 onCreate()方法:
该方法一般是执行sql语句,像数据库里插入需要用到的数据库表

升级数据库会使用onUpgrade()方法
该方法接收三个参数: SQLiteDatabase 对象,oldVersion : int 和 newVersion : int。版本号就是用int变量表示一般来说,需要在方法里添加对新旧版本的判断。如果要对新表进行修改,还得加上数据迁移的逻辑

数据迁移的逻辑参考:
1.将现有表以别名命名 2.创建新表 3.迁移数据 4.删除现有表

将这个两个方法重写完成之后,我们就能借助SQLiteOpenhelper的具体实例来获取到db


val dbHelper = MyDatabaseHelper(this,"BookStore.db",1)

dbHelper.writableDatabase
dbHelper.readableDatabase

在我们创建SQLiteOpenHelper实例的时候。根据我们传入的数据库名,如果该数据库不存在,他会自动创建数据库。同理,若现有数据库的版本和传入的版本号不同,那么他也会根据onUpdate()中的方法,帮我们进行数据库升级的操作。

SQLiteOpenHelper 提供了getWritableDatabase()和getReadableDatabase()两个方法来供我们获取SQLiteDatabase的实例。


SQLiteDatabase db = getWritableDatabase();
SQLiteDatabase db2 = getReadableDatabase();

2.2 CRUD

谈到数据库,那免不了说到CRUD了,即我们常说的增删改查。最直接的方法肯定是直接传入SQL语句,当然也可以通过 SQLiteDataBase类中的相关方法来进行增删改查的操作
可以直接写sql

增删改:db.execSQL(,)

查:db.rawQuery(,)

val createBook = "create table Book ( id integer primary key autoincrement," +
        "author text,price real,pages integer,name text)"
db.execSQL(createBook)

可以调用这两个方法,并直接传入sql语句。此外,这两个方法都允许接收两个参数,第一个参数是SQL语句,第二个是参数是对占位符的设置

增加数据:SQLiteDatabase中提供了一个insert()方法,接收三个参数,第一个是表名,第二个是自动赋值所需传入的值,第三个是ContentValues对象(类似于HashMap,但根据Android的特点进行了额外的设置,例如实现了Parceable接口)

ContentValues 可以一直put

val db = dbHelper.writableDatabase
val values1 = ContentValues().apply {

    put("name","Thr Da Vinci code")
    put("author","Dan Brown")
    put("Pages",454)
    put("price",16.96)

}
db.insert("Book", null,values1)

更新数据: update()方法,接收四个参数,第一个参数是表名,第二个参数是ContentValues对象,第三和第四用于约束更新某一行或某几行的数据

第三个参数就是类似SQL语句,要更新哪一部分的数据 ,?是占位符。第四个参数指定占位符所代表的值

val db = dbHelper.writableDatabase
val values = ContentValues()
values.put("price",10.99)
db.update("Book",values,"name = ?", arrayOf("The Da Vinci Code"))

删除数据:delete()方法,接受3个参数,第一个参数是表名,第二,三个参数用于约束删除哪几行的代码。和上面update()方法的最后两个参数的用法差不多

val db = dbHelper.writableDatabase
db.delete("Book","pages > ?", arrayOf("500"))

查询数据:query()方法,这个方法较为复杂。最简单的重载都有7个参数。这里就直接放张《第一行代码》里的图吧。

Android基础(1) -SQLite

调用query()方法后会返回一个Cursor对象,所需数据都可以从这个对象中取出

val db = dbHelper.writableDatabase
val cursor = db.query("Book", null,null,null,null,null,null)
if(cursor.moveToFirst()){
    do{
        val name = cursor.getString(cursor.getColumnIndex("name"))
        val author = cursor.getString(cursor.getColumnIndex("author"))
        val pages = cursor.getInt(cursor.getColumnIndex("pages"))
        val price = cursor.getDouble(cursor.getColumnIndex("price"))
        Log.d("MainActivity","book name is $name")
        Log.d("MainActivity","book author is $author")
        Log.d("MainActivity","book pages is $pages")
        Log.d("MainActivity","book price is $price")

    }while (cursor.moveToNext())
}
cursor.close()

数据库事务
在增删改查时,不免要使用到数据库事务。SQLite提供了多种方法来帮我们实现数据库事务。下面只给出最常用的调用方法

     db.beginTransaction();
     try {
       ...

       db.setTransactionSuccessful();
     } finally {
       db.endTransaction();
     }

3.参考资料

《第一行代码》

Original: https://blog.csdn.net/m0_50930469/article/details/123113212
Author: 黄二小二
Title: Android基础(1) -SQLite

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815727/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球