实现房间数据库(Android)

问题描述 投票:0回答:3

我想知道如何在 Android 应用程序中正确集成 Room 库。我看到的一些文章使用单例方法,使用存储库进行数据库调用,而其他文章则使用某种形式的依赖注入(Dagger 2)。我想知道这个库的正确集成?

谢谢

android database sqlite android-room android-livedata
3个回答
2
投票

房间数据库

  • Room 是 Android 开发中用于 SQLite 数据库的 ORM(对象关系映射器),也是 Android Jetpack 的一部分。
  • 在 SQLite 数据库上提供抽象层
  • 减少了样板代码量
  • SQL 查询的编译时验证

ROOM 数据库组件

  • 它有 3 个主要组件实体、数据库、DAO。
  • Entity是用@Entity注解的数据类,就像在SQLite中创建一个表,模型类中的变量就像表中的列。
  • Database 是一个抽象类,它扩展了 RoomDatabase 并具有与数据库关联的实体列表。
  • DAO(数据访问对象)是一个定义要在我们的数据库中执行的操作的接口。

ROOM数据库实施

  • 第 1 步创建Entity数据类

    @Entity(tableName = "yourOwnTableName")

    数据类 LocalData(

      val column1: String?,
    
      val column2: String?,  
    
      @PrimaryKey(autoGenerate = true) val product_local_id: Int?= null
    

  • 第2步创建数据库

    @Database(实体 = [LocalData::class],版本 = 1,exportSchema = false) @类型转换器

    抽象类 LocalDB : RoomDatabase() {

      abstract fun localDataDao() : LocalDataDAO
    
      companion object{
    
          private var instance : LocalDB ? = null
    
          fun getInstance(context: Context) : LocalDB ?{
              if(instance == null){
                  synchronized(LocalDB ::class){
                      instance = Room.databaseBuilder(context.applicationContext, LocalDB::class.java, "localBD.db").allowMainThreadQueries().build()
                  }
              }
              return instance
          }
    
          fun destroyInstance(){
              instance = null
          }
      }
    

    }

  • 第3步创建DAO

    @道 接口 LocalDAO {

      @Insert
      fun insertData(productEntity: LocalData) : Long
    
      @Delete
      fun deleteData(productEntity: LocalData) : Int
    
      @Query("Select * from yourOwnTableName")
      fun showAllProducts(): List<LocalData>
    
      @Query("SELECT COUNT(*) FROM yourOwnTableName")
      fun totalProducts(): Long
    

    }

  • 第 4 步是可选的,即创建 存储库

类 ProductRepository(上下文:上下文){

var dbms : LocalDAO = LocalDB.getInstance(context)?.localDataDao()!!

fun insertData(productEntity: LocalData) : Long{
    return dbms.insertData(productEntity)
}

fun deleteData(productEntity: LocalData) : Int{
    return dbms.deleteData(productEntity)
}

fun getAllData() : List<LocalData> {
    return dbms.showAllProducts()
}

fun checkProductExist(id : Int) : Boolean{
    return dbms.exists(id)
}

fun totalProductsInCart() : Long{
    return dbms.totalProducts()
}

}


0
投票

我认为最好的地方是 Codelab,它有一个简单的实现,以及一个更复杂的实现。全部使用房间。

编辑:上面的链接似乎已被删除。这里有一些资源可以替代它:

  1. 安卓景观房
  2. 房间+LiveData+ViewModel

0
投票

取决于您的项目需求,目前大多数项目都使用依赖注入。您看到许多使用单例的示例的原因是因为作者不打算使新主题的解释变得更加复杂。 你可以看我写的一个medium,出于同样的原因我也做了同样的事情。

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.