Android笔记 (三)SQLite数据持久化存储

简述数据持久化存储

  1. mmkv使用的是短数据存储,同步,速度快。
  2. DataStore 异步存储,总体速度优于 SharedPreferences,是谷歌预备替换之的解决方案。
  3. Context 的 openFileOutput()方案… 嗯???
  4. SQLite 适用于结构复杂、数据条目量大的应用场景

SQLiteOpenHelper

  1. 抽象方法 onCreate() 创建数据库

  2. onUpgrade() 升级数据库

  3. getReadableDatabase() 和 getWritableDatabase() ,都可以创建或打开一个数据库(存在打开,否则创建),并返回一个新的数据库用于读写,不同的是,若磁盘已满或无法写入,getReadableDatabase()可只读方式打开,getWritableDatabase()则报错

    数据库类型对比:

KotlinSQLite
Intinteger
Floatreal
Stringtext
二进制blob

创建数据库

继承SQLiteOpenHelper,如下所示:

class MyDatabaseHelper(val context: Context, name: String, version: Int) :
	// context, 数据库名,自定义的Cursor,版本号
	SQLiteOpenHelper(context, name, null, version)
{

	// primary key 表示将 id 设为主键,用autoincrement表示之列自增长的。
	private val createBook = """
		create table Book(
		id integer primary key autoincrement,
		author text,
		price real,
		pages integer,
		name text)
	""".trimIndent()

	override fun onCreate(db: SQLiteDatabase)
	{
		// 创建表
		db.execSQL(createBook)
		Toast.makeText(context, "Done", Toast.LENGTH_SHORT).show()
	}

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

	}
}

这里的创建代码为createBook字段。

使用插件 Database Navigator 查看

初始化方法:

class MainActivity : AppCompatActivity()
{
	override fun onCreate(savedInstanceState: Bundle?)
	{
		super.onCreate(savedInstanceState)
		val myDatabaseHelper = MyDatabaseHelper(this, "BookStore.db", 1)
				.apply {
					// 也就是调用 getWritableDatabase()
					// 首次创建后,再次运行不会重新创建
					writableDatabase
				}
	}
}

升级数据库

onUpgrade()用于对数据库升级。
比如说,在原有的基础上增加一块表,是无法成功的(因为已经存在了),所以,可以如下所示:

class MyDatabaseHelper(val context: Context, name: String, version: Int) :
	// context, 数据库名,自定义的Cursor,版本号
	SQLiteOpenHelper(context, name, null, version)
{

	// primary key 表示将 id 设为主键,用autoincrement表示之列自增长的。
	private val createBook = """
		create table Book(
		id integer primary key autoincrement,
		author text,
		price real,
		pages integer,
		name text)
	""".trimIndent()

	private val createCategory = """
		create table Category (
			id integer primary key autoincrement,
			category_name text,
			category_code integer
		)
	""".trimIndent()
	override fun onCreate(db: SQLiteDatabase)
	{
		// 创建表
		db.execSQL(createBook)
		db.execSQL(createCategory)
		Toast.makeText(context, "Done", Toast.LENGTH_SHORT).show()
	}

	override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int)
	{
		// 如果存在表则删除
		db.execSQL("drop table if exists Book")
		db.execSQL("drop table if exists Category")
		onCreate(db)
	}
}

另外,还要记得对实例化处进行更新:

MyDatabaseHelper(this, "BookStore.db", 2)

增删查改

这部分篇幅较长,后续会更新,不会超过2022年8月27号