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
    评论
在 Android 中,房间(Room)是一个持久化库,它提供了一种在 SQLite 数据库上进行抽象的方式。它可以帮助你更轻松地管理 SQLite 数据库,同时提供了一些有用的功能,比如类型转换、简单查询、关联查询等。而 ContentProvider 则是一种组件,它可以帮助你在应用程序之间共享数据。 下面是它们的使用方法: 1. Room使用: a. 定义实体类:在 Room 中,实体类代表了在数据库中存储的数据表。你需要使用 `@Entity` 注解来标注实体类,并且在其中定义表的列名和类型。 b. 定义 DAO:DAO(数据访问对象)是一个接口,它定义了访问数据库的方法。在 DAO 中,你可以定义增删改查等操作,使用 `@DAO` 注解来标注接口。 c. 定义数据库:你需要定义一个继承自 `RoomDatabase` 类的抽象类,使用 `@Database` 注解来标注。在这个类中,你需要定义数据库的版本号、实体类和 DAO。 d. 使用 Room:在应用程序中,你可以通过创建 `RoomDatabase` 的实例来使用 Room。你可以使用 `Room.databaseBuilder()` 方法来创建数据库,并且使用 `build()` 方法来构建数据库的实例。然后你就可以使用 DAO 中定义的方法来访问数据库了。 2. ContentProvider使用: a. 定义 ContentProvider:你需要继承自 `ContentProvider` 类,并且实现其中的 `query()`、`insert()`、`update()` 等方法。在 ContentProvider 中,你需要定义 URI(统一资源标识符),它代表了数据的位置。使用 `ContentResolver` 类可以访问 ContentProvider。 b. 注册 ContentProvider:在应用程序的 AndroidManifest.xml 文件中,你需要声明你的 ContentProvider使用 `provider` 标签来声明 ContentProvider,并且使用 `android:authorities` 属性来定义 URI。 c. 使用 ContentProvider:在应用程序中,你可以使用 `ContentResolver` 类来访问 ContentProvider。你需要通过 URI 来访问数据,使用 `query()`、`insert()`、`update()` 等方法来进行数据操作。 总的来说,RoomContentProvider 都是 Android 中的持久化库,它们有各自的使用场景。如果你需要在应用程序之间共享数据,或者需要提供数据给其他应用程序使用,那么使用 ContentProvider 是比较合适的。如果你只是需要管理应用程序内部的数据库,那么 Room 是比较合适的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值