一:创建主界面增删改查
/**
* @author zhiqiangRuan
* @ClassName
* @Date2022/7/4
*/
class FiveActivity : BaseActivity(), View.OnClickListener {
lateinit var addData: Button
lateinit var deleteData: Button
lateinit var queryData: Button
lateinit var updataData: Button
var bookId: String? = null
override fun initView() {
addData = https://www.it610.com/article/findViewById
文章图片
二:Xml文件
三:自定义的MyProvider
package com.cnstrong.leke.helloworldimport android.content.ContentProvider
import android.content.ContentValues
import android.content.UriMatcher
import android.net.Uri
import java.lang.RuntimeException/**
* @author zhiqiangRuan
* @ClassName 自定义ContentProvider
* @Date2022/7/4
*/
class MyProvider : ContentProvider() {private val bookDir = 0
private val bookItem = 1private val categoryDir = 2
private val categoryItem = 3/**
* 每一个ContentProvider定义唯一标识URIURI*/
private var dbHelper: MySqliteDataHelper? = nullprivate val authority = "com.cnstrong.leke.helloworld.provider"/**UriMatcher本质上是一个文本过滤器,用在contentProvider中帮助我们过滤,分辨出查询者想要查询哪个数据表。*/
private val uriMatcher by lazy {
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
val mathcher = UriMatcher(UriMatcher.NO_MATCH)
//如果match()方法匹配content://com.cnstrong.leke.helloworld.provider/book路径,返回匹配码为1
mathcher.addURI(authority, "book", bookDir)
//如果match()方法匹配content://com.cnstrong.leke.helloworld.provider/book/通配符 路径,返回匹配码为2
mathcher.addURI(authority, "book/#", bookItem)mathcher.addURI(authority, "category", categoryDir)
mathcher.addURI(authority, "category/#", categoryItem)
mathcher
}/**创建数据*/
/**
* override fun onCreate(): Boolean {
dbHelper = context?.let {
MySqliteDataHelper(it, "BookStore.db", 1)
return true
}
return false------------------------------
这里用到了Kotlin let操作符
obj.let{} 或obj?.let{}
第一种写法,如果确定obj不为null,可以使用,
第二种写法相当于java的非空判断,当obj不为空时,才执行大括号内的代码段,相对java的空判断来说简洁一些,值得使用。
//在函数体内使用it替代object对象去访问其公有的属性和方法
} */
override fun onCreate() = context?.let {
MySqliteDataHelper(it, "BookStore.db", 1)
true
} ?: false/**查询数据*/override fun query(
uri: Uri,
projection: Array?,
selection: String?,
selectionArgs: Array?,
sortOrder: String?
) = dbHelper?.let {
//查询数据
val db = it.writableDatabase
val cursor = when (uriMatcher.match(uri)) {
bookDir -> db.query("Book", projection, selection, selectionArgs, null, null, sortOrder)
bookItem -> {
val bookId = uri.pathSegments[1]
db.query("Book", projection, "id=?", arrayOf(bookId), null, null, sortOrder)
}
categoryDir -> db.query(
"Category",
projection,
selection,
selectionArgs,
null,
null,
sortOrder
)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.query("Category", projection, "id=?", arrayOf(categoryId), null, null, sortOrder)
}
else->null
}
cursor}/**
* 得到数据类型*/override fun getType(uri: Uri) = when (uriMatcher.match(uri)) {
bookDir -> "vnd.android.cursor.dir/vnd.com.cnstrong.leke.helloworld.provider.book"
bookItem -> "vnd.android.cursor.item/vnd.com.cnstrong.leke.helloworld.provider.book"
categoryDir -> "vnd.android.cursor.dir/vnd.com.cnstrong.leke.helloworld.provider.category"
categoryItem -> "vnd.android.cursor.item/vnd.com.cnstrong.leke.helloworld.provider.category"
else -> null
}/**插入数据
*
*override fun insert(uri: Uri, values: ContentValues?): Uri? {
//获取到SQLiteDatabase 对象
val db = dbHelper?.writableDatabase
val uriReturn = when (uriMatcher.match(uri)) {
bookDir, bookItem -> {
val newBookId = db?.insert("Book", null, values)
Uri.parse("content://$authority/book/$newBookId")
}
categoryDir, categoryItem -> {
val newCategoryId = db?.insert("Category", null, values)
Uri.parse("content://$authority/category/$newCategoryId")
}
else -> null
}
return uriReturn}*/override fun insert(uri: Uri, values: ContentValues?) = dbHelper?.let {
//获取到SQLiteDatabase 对象
val db = it.writableDatabase
val uriReturn = when (uriMatcher.match(uri)) {
bookDir, bookItem -> {
val newBookId = db.insert("Book", null, values)
Uri.parse("content://$authority/book/$newBookId")
}
categoryDir, categoryItem -> {
val newCategoryId = db.insert("Category", null, values)
Uri.parse("content://$authority/category/$newCategoryId")
}
else ->null
}
uriReturn}/**删除数据*/override fun delete(uri: Uri, selection: String?, selectionArgs: Array?) =
dbHelper?.let {
//删除数据
val db = it.writableDatabase
val deleteRows = when (uriMatcher.match(uri)) {
bookDir -> db.delete("Book", selection, selectionArgs)
bookItem -> {
//筛选条件参数
val bookId = uri.pathSegments[1]
db.delete("Book", "id=?", arrayOf(bookId))
}
categoryDir -> db.delete("Category", selection, selectionArgs)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.delete("Category", "id=?", arrayOf(categoryId))
}
else -> 0
}
deleteRows} ?: 0/**更新数据*/override fun update(
uri: Uri,
values: ContentValues?,
selection: String?,
selectionArgs: Array?
) = dbHelper?.let {
val db = it.writableDatabase
val updateRows = when (uriMatcher.match(uri)) {
bookDir -> db.update("Book", values, selection, selectionArgs)
bookItem -> {
val bookId = uri.pathSegments[1]
db.update("Book", values, "id=?", arrayOf(bookId))
}
categoryDir -> db.update("Category", values, selection, selectionArgs)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.update("Category", values, "id=?", arrayOf(categoryId))
}
else -> 0
}
updateRows} ?: 0
}
四:MySqliteDataHelper 数据库创建的帮助类
package com.cnstrong.leke.helloworldimport android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.widget.Toast/**
* @author zhiqiangRuan
* @ClassName
* kotlin 构造函数 参数
* val context: Context 上下文
* name: String数据库名,库名 xxx.db
* version: Int 版本号,用来数据库升级的
* @Date2022/7/4
*/
class MySqliteDataHelper(val context: Context, name: String, version: Int) :
SQLiteOpenHelper(context, name, null, version) {private val book = "create table Book( " +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)"private val category = "create table Category( " +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)"/**使用SQliteDatabase创建数据表
*
* 1.这个方法,第一次打开数据库时候才会走
* 2.在清除数据之后再一次运行-->打开数据库,这个方法会走
* 3.没有清除数据,不会走这个方法
* 4.数据库升级的时候这个方法不会走
* */
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(book)
db?.execSQL(category)
Toast.makeText(context, "create books success", Toast.LENGTH_SHORT).show()}/**
* 1.第一次创建数据库的时候,这个方法不会走
*
*2.清除数据再次运行(相当于第一次创建)这个方法不会走
*
* 3.数据库已经存在,而且版本升高的时候,这个方法才会调用*/
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
//根据版本号判断
if (oldVersion <= 1) {
db?.execSQL("alter table Book add column category_id")
}
}/**这个方法是数据库降级操作
*
* 1.新版本比旧版本低时候才会执行
*
* 2.如果不执行降级操作会抛出异常*/override fun onDowngrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
super.onDowngrade(db, oldVersion, newVersion)
}
}
【Android Kotlin语言学习第三课(自定义ContentProvider和SQlite学习增删改查)】五:MyProvider的AndroidManifest配置
六:遇到的问题
文章图片
不知道什么原因,有大神知道吗,需要指导一下