首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在android中使用ORM工具实现created_at和updated_at列

如何在android中使用ORM工具实现created_at和updated_at列
EN

Stack Overflow用户
提问于 2018-02-22 08:08:03
回答 2查看 12.6K关注 0票数 14

如何使用Android中的created_at工具实现updated_atRoom Persistence ORM列,以便在创建或更新表中的行时自动更新时间戳?

EN

Stack Overflow用户

发布于 2018-05-02 19:37:53

我研究了许多网站,但仍然没有发现任何结果可以处理middleware或类似callbacks的东西,当我们QueryInsertUpdateDelete,……方法从DAOs.

正如@selvin所说,RoomDatabase.Callback接口只在第一次创建数据库时调用。所以,使用那个接口是不正确的方式。所以,也许下面的方法对我来说是个窍门,希望这会对你有所帮助:

1.我们需要创建一个BaseModel

此模型可以确保数据库中的所有模型总是可用的列creation_datemodification_date

代码语言:javascript
运行
复制
abstract class BaseModel: Serializable {

    @PrimaryKey(autoGenerate = true) 
    @Expose
    var id: Long = 0

    @ColumnInfo(name = "description")
    @SerializedName(value = "description")
    var description: String? = null

    @ColumnInfo(name = "creation_date")
    @SerializedName(value = "creation_date")
    var creationDate: Date = Date(System.currentTimeMillis())

    @ColumnInfo(name = "modification_date")
    @SerializedName(value = "modification_date")
    var modificationDate: Date = Date(System.currentTimeMillis())

}

2.创建一个BaseDAO

BaseDAO中,我还创建了一个名为DAOWrapper的包装类,这个类将存储所有有用的方法,在将模型的数据交互到DAO之前,我们将使用这些方法来处理“中间件”之类的数据。

所以,为什么我们不在BaseDAO**?** ->中创建方法--我们不能这么做!使用这种方式将与android体系结构发生冲突,而且编译器也会出现错误( DAO对象中声明的所有方法都需要注释UpdateQuery、.)。

代码语言:javascript
运行
复制
interface BaseDAO<T> where T: BaseModel {

    fun getAll(): List<T>

    @Insert(onConflict = OnConflictStrategy.ABORT)
    fun insert(modelData: T)

    @Update(onConflict = OnConflictStrategy.ABORT)
    fun update(modelData: T)

    companion object {

        open class DAOWrapper<P, T>(private val daoInstance: T) where T: BaseDAO<P>, P: BaseModel {

            fun insertWithTimestapData(modelData: P) {
                modelData.modificationDate = Date(System.currentTimeMillis())
                this@DAOWrapper.daoInstance.insert(modelData)
            }

        }

    }

}

3.使用DAOWrapper

代码语言:javascript
运行
复制
val appDatabase = // Do something to get RoomDatabase instance...
val exampleDao = appDatabase.exampleDAO()
val exampleDaoWrapper = BaseDAO.Companion.DAOWrapper(exampleDao)

val exampleModel = ExampleModel(name = "Example Name")
exampleDaoWrapper.insertWithTimestapData(exampleModel)

参考文献

下面是RoomDatabase的示例实例和我在上面的代码中使用的示例模型:

代码语言:javascript
运行
复制
/** ExampleModel.kt */
@Entity(
    tableName = "examples",
    indices = [Index(value = arrayOf("name"), unique = true)]
)
class ExampleModel(): BaseModel() {

    @ColumnInfo(name = "name")
    @SerializedName(value = "name")
    var name: String = String()

    @Ignore
    constructor(name: String): this() {
        this@ExampleModel.name = name
    }

}


/** ExampleDAO.kt */
@Dao
interface ExampleDAO: BaseDAO<ExampleModel> {

    @Query("SELECT * FROM `examples`")
    override fun getAll(): List<ExampleModel>

}


/** AppDatabase.kt **/
@Database(entities = [ExampleModel::class], version = 1)
abstract class AppDatabase: RoomDatabase() {

    abstract fun exampleDAO(): ExampleDAO

    companion object {
        private var databaseInstance: AppDatabase? = null
        public const val DatabaseName: String = "app_database"

        fun getDatabase(context: Context): AppDatabase {
            this@Companion.destroyAndCreateNewInstanceIfNeeded(context)
            return this@Companion.databaseInstance!!
        }

        fun destroyAndCreateNewInstanceIfNeeded(context: Context) {
            synchronized(AppDatabase::class) {
                this@Companion.databaseInstance?.close()
                this@Companion.databaseInstance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    this@Companion.DatabaseName
                ).build()
            }
        }
    }

}
票数 7
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48922384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档