前言
Android保存数据除了使用文件,其实还可以使用Sqlite,很多人肯定都知道SQL语言,使用SQL语言可以很方便的操控MySql这类的数据库,用于管理关系型数据库,特别方便,在Android中也有这种管理数据的方式,那就是Android Sqlite,Sqlite 是一个轻量级的关系型数据库,占用的空间非常小,并且兼容性很好,在很多的嵌入式设备中存储数据都是使用它。而且它的用法和Mysql的SQL语言差不多,而且Android还专门做了封装来简化Sqlite的使用。下面就让我们来看下如何在Android中使用Sqlite吧。
一、Android中的数据存储方式
二、Sqlite 简介
二、Sqlite在Android中如何使用(Kotlin 方式)
1.写一个类继承自SQLiteOpenHelper,并且实现它的两个抽象方法
这里的SQLiteOpenHelper是Google对SQLiteDatabase的又一层封装,方便咱们开发者使用,使用SQLiteDatabase这个也是可以的。只是稍微复杂点,咱们这里主要讲SQLiteOpenHelper方式
代码如下(示例):
const val TAG = "MyDbSqliteHelper"
private const val DB_VERSION = 1
class MyDbSqliteHelper(context: Context?,name: String?,factory: SQLiteDatabase.CursorFactory?,version: Int)
: SQLiteOpenHelper(context, name, factory, version) {
constructor(context: Context?,name: String?) : this(context,name,null, DB_VERSION) {
}
override fun onCreate(db: SQLiteDatabase?) {
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
}
}
这时我们会发现在类中需要重写onCreate
和onUpgrade
,onCreate
是当我们第一次创建数据库时会调用,而onUpgrade
是我们数据库升级的时候会调用
2.实现两个方法
const val TAG = "MyDbSqliteHelper"
private const val DB_VERSION = 1
class MyDbSqliteHelper(context: Context?,name: String?,factory: SQLiteDatabase.CursorFactory?,version: Int)
: SQLiteOpenHelper(context, name, factory, version) {
constructor(context: Context?,name: String?) : this(context,name,null, DB_VERSION) {
}
override fun onCreate(db: SQLiteDatabase?) {
val sql: String = "create table table1(id int,name varchar(20),age int,sex varchar(10))"
db?.execSQL(sql) ?: "db is null"
Log.e(TAG, "onCreate")
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
Log.i(TAG, "onUpgrade: update Database")
if(newVersion>oldVersion){
// 使用 SQL的ALTER语句
val sql = "alter table table1 add address varchar(8)"
db?.execSQL(sql)
}
}
在onCreate方法中,咱们创建了一个名为table1的数据库表。并且定义了它的表字段。,在onUpgrade中我们做数据库的更新操作,在这个方法中我们可以看到两个版本号参数,一个是oldVersion,newVersion,我们可以对比这两个版本号来做数据库升级,当我们创建数据库的时候会传入数据库的版本号,需要注意的是这个版本号只能递增。
3.使用
class MainActivity : AppCompatActivity() {
private val TAG:String = "MainActivity=>Log"
private lateinit var createDbBtn:Button
private lateinit var updateDbBtn:Button
private lateinit var insertDataBtn:Button
private lateinit var updateDataBtn:Button
private lateinit var queryDataBtn:Button
private lateinit var deleteDataBtn:Button
private lateinit var tvResult: TextView
private lateinit var dbHelper: SQLiteOpenHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
initListener()
}
private fun initListener() {
createDbBtn.setOnClickListener {
dbHelper = MyDbSqliteHelper(this, "table1",null,1)
val db = dbHelper.readableDatabase
val path = db.path
Log.d(TAG,"db path:$path" )
}
updateDbBtn.setOnClickListener {
//更新数据库的版本号后,就会走SQLiteOpenHelper中的onUpgrade方法,执行数据库升级方法
val dbSqliteHelper = MyDbSqliteHelper(this, "table1", null, 2)
val readableDatabase = dbSqliteHelper.readableDatabase
Log.d(TAG,"update db path:${readableDatabase.path}" )
}
insertDataBtn.setOnClickListener {
dbHelper= MyDbSqliteHelper(this,"table1",null,1)
//获取一个可写的数据库
val db:SQLiteDatabase = dbHelper.writableDatabase
val contentValues = ContentValues()
//contentValues.put("id",1)
with(contentValues){
put("id",1)
put("name","zhongxj")
put("age",21)
put("sex","male")
}
val cv = ContentValues()
with(cv){
put("id",2)
put("name","yaoyao")
put("age",22)
put("sex","female")
}
val insert = db.insert("table1", null, contentValues)
db.insert("table1",null,cv)
Log.d(TAG,"insert result: $insert")
db.close()
}
queryDataBtn.setOnClickListener {
dbHelper= MyDbSqliteHelper(this,"table1",null,1)
tvResult.text=""
val readableDb = dbHelper.readableDatabase
val cursor = readableDb.query(
"table1", arrayOf("id", "name", "age", "sex","address"), null,
null, null, null, null
)
//参数1:表名
//参数2:要想显示的列
//参数3:where子句
//参数4:where子句对应的条件值
//参数5:分组方式
//参数6:having条件
//参数7:排序方式
// 通过游标遍历1个名为user的表
val result=readableDb.rawQuery("SELECT * FROM table1",null)
// result.moveToFirst()
while (cursor.moveToNext()){
val nameIndex = cursor.getColumnIndex("name")
val ageIndex = cursor.getColumnIndex("age")
val sexIndex = cursor.getColumnIndex("sex")
val idIndex = cursor.getColumnIndex("id")
// val adressInd = cursor.getColumnIndex("address")
// val address = cursor.getString(adressInd)
val name = cursor.getString(nameIndex)
val age = cursor.getString(ageIndex)
val sex = cursor.getString(sexIndex)
val id = cursor.getString(idIndex)
tvResult.text="${tvResult.text} \n id:$id name:$name,age:$age,sex:$sex"
}
cursor.close()
readableDb.close()
}
updateDataBtn.setOnClickListener {
val writableDb = dbHelper.writableDatabase
val cv = ContentValues()
cv.put("name","yaoyao")
val whereCondition = "id=?"
val whereArgs = arrayOf("1")
writableDb.update("table1",cv,whereCondition,whereArgs)
writableDb.close()
}
deleteDataBtn.setOnClickListener {
val readableDb = dbHelper.readableDatabase
val whereCondition = "id=?"
val whereArgs = arrayOf("1")
val delete = readableDb.delete("table1", whereCondition, whereArgs)
Log.d(TAG,"insert result: $delete")
}
}
private fun initView() {
createDbBtn = findViewById(R.id.btn_create_db)
updateDbBtn = findViewById(R.id.btn_update_db)
insertDataBtn = findViewById(R.id.btn_insert_data)
updateDataBtn = findViewById(R.id.btn_update_data)
queryDataBtn = findViewById(R.id.btn_query_data)
deleteDataBtn = findViewById(R.id.btn_delete_data)
tvResult = findViewById(R.id.tv_result)
}
}
4.调试界面
这里需要主要假如点击了更新数据库按钮,这时意味着你的数据库的版本增加了一,这时你再去点击插入数据删除数据会闪退,因为你的数据库已经升级到版本2,意味着你的数据库表有了改动,但是你读写还是用的数据库版本一的读写方式,所以会崩。当数据库更新的时候,其实相应的读写代码也更新了,所以这种情况真实的场景中不会出现的。这里只是为了演示。
三、查看Sqlite数据库中的数据
我用的是sqliteSpy,工具可以在我的资源中下载。不收积分。
直接到你手机中的相关目录下拿到sqlite的文件,一般都是xxx.db,然后用SqliteSpy软件打开,就可以查看了。
总结
本篇文章主要是做了Android sqlite的简单使用和使用场景,只是为了让读者知道有这样一种存储方式可以使用,具体要用的时候建议参考官方文档。