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();//游标移到下一个地方
//上面的方法以及其他和move有关的方法,返回值就是移动是否成功的结果
int getColumnIndex(String columnName);//传入列名获取位置索引
String getColumnName(int columnIndex);//根据列索引获取列名
String getString(int columnIndex);//根据传入的索引获取到string类型的数据
int getInt(int columnIndex);//根据传入的索引获取到int类型的数据

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

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

public ContentValues()//创建一个空的arrayMap
public void put(String key, String value)//向arrayMap插入数值,key是值名,value是数据

2. 数据库基本操作

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

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

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

override fun onCreate(db: SQLiteDatabase) {
    //一般是传入建表SQL语句
}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    //数据库升级逻辑,一般是插入新表。修改现有的表时,要注意数据迁移
}

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

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

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


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

//kotlin代码
val dbHelper = MyDatabaseHelper(this,"BookStore.db",1)
//参数:上下文,数据库名,版本号
dbHelper.writableDatabase//获取可写入的数据库
dbHelper.readableDatabase//获取只可读的数据库

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

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

//java代码,上面的kotlin可能可读性没那么强,所以这里加上java
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个参数。这里就直接放张《第一行代码》里的图吧。

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

val db = dbHelper.writableDatabase
val cursor = db.query("Book", null,null,null,null,null,null)
if(cursor.moveToFirst()){//打印book表中的所有数据
    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.参考资料

《第一行代码》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值