Room数据库结合ContentProvider的使用

一、room数据库的使用

       在Android开发中,要使用数据存储时,第一想到的就是room数据库。

      room数据库的使用分为已下几部:

      1.导入依赖
def roomVersion = "2.4.1"
implementation ("androidx.room:room-runtime:$roomVersion")
kapt ("androidx.room:room-compiler:$roomVersion")
      2.实体类。数据库的表结构
@Entity
data class SearchHistoryBean(
    //主键,自增
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0,
    var key: String = ""
)
    3.数据的增删查找操作
@Dao
interface SearchHistoryDao {
  @Query("select * from SearchHistoryBean")
  fun query(): List<SearchHistoryBean>?
  @Insert(onConflict = OnConflictStrategy.REPLACE)
  fun insert(entity: SearchHistoryBean)

  @Update
  fun update(entity: SearchHistoryBean)

  @Delete
  fun delete(entity: SearchHistoryBean)
    4.创建数据库
@Database(entities = [SearchHistoryBean::class], version = 1, exportSchema = false)
abstract class AppDataBase : RoomDatabase() {

    abstract fun searchHistoryDao(): SearchHistoryDao

   companion object {
       @Volatile
       private var instance: AppDataBase? = null

       fun getInstance(context: Context): AppDataBase {
         return instance ?: synchronized(this) {
           instance ?: buildDataBase(context).apply {
              instance = this
              }
          }
       }

      fun buildDataBase(context: Context): AppDataBase {
        return Room.databaseBuilder(context, AppDataBase::class.java, "xgimiMusic-database").build()
      }
   }
}

   到这里一个简单的room数据库就可以使用了

二、ContentProvider的使用

class HistoryProvider : ContentProvider() {
    private var appDataBase: AppDataBase? = null

    private fun getReadableDatabase(): SupportSQLiteDatabase? {
        return appDataBase?.openHelper?.readableDatabase
    }

    private fun getWritableDatabase(): SupportSQLiteDatabase? {
        return appDataBase?.openHelper?.writableDatabase
    }

    override fun onCreate(): Boolean {
        appDataBase = AppDataBase.getInstance(context)
        return true
    }

    override fun getType(uri: Uri): String? {
        return null
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        val db = getWritableDatabase() ?: return null
        var insertUri: Uri? = null
        var insertId: Long = -1
        try {
            db.beginTransaction()
            insertId = db.insert(SongHistoryDatabase.TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values)
            insertUri = ContentUris.withAppendedId(uri, insertId)
            db.setTransactionSuccessful()
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            db.endTransaction()
        }
        return insertUri
    }

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrder: String?
    ): Cursor? {
        val db = getReadableDatabase() ?: return null
        val limitStr = uri.getQueryParameter("limit")
        var cursor: Cursor? = null
        try {
            db.beginTransaction()
            val sql = SQLiteQueryBuilder.buildQueryString(
                false,
                SongHistoryDatabase.TABLE_NAME,
                projection,
                selection,
                null,
                null,
                sortOrder,
                limitStr
            )
            cursor = db.query(sql, selectionArgs)
            db.setTransactionSuccessful()
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            db.endTransaction()
        }
        return cursor
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
        var numRemoved: Int = -1
        val db = getWritableDatabase() ?: return numRemoved
        try {
            db.beginTransaction()
             db.delete(SongHistoryDatabase.TABLE_NAME, selection, selectionArgs)
            db.setTransactionSuccessful()
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            db.endTransaction()
        }
        return numRemoved
    }

    override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int {
        var numUpdate: Int = -1
        val db = getWritableDatabase() ?: return numUpdate
        try {
            db.beginTransaction()
              db.update(SongHistoryDatabase.TABLE_NAME, SQLiteDatabase.CONFLICT_NONE, values, selection, selectionArgs)
            db.setTransactionSuccessful()
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            db.endTransaction()
        }
        return numUpdate
    }
}

这里与使用传统的SQLite数据库有几个不同之处:

       1.在SQLite增删查改中需要用到SQLiteDatabase去操作数据库。而room数据库提供了SupportSQLiteDatabase,SupportSQLiteDatabase同样具有增删查改方法。所有在onCreate() 需要得到RoomDatabase的子类对象,然后通过 appDataBase?.openHelper?.readableDatabase 或者 appDataBase?.openHelper?.writableDatabase 得到SupportSQLiteDatabase对象

      2.在query()中,SupportSQLiteDatabase只支持入参为sql字符串,所以需要把参数转换为sql语句,SQLiteQueryBuilder.buildQueryString() 就是源码SQLiteDatabaseh中把参数转化为sql的方法,所以我们直接拿出来用就好

其他几个方法的使用RoomDatabase和SQLiteDatabase基本一致

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值