【问题标题】:Android Room, Capping max database sizeAndroid Room,限制最大数据库大小
【发布时间】:2018-12-10 09:57:51
【问题描述】:

我正在开发一个生产应用程序,所以我无法共享代码。但我会尽力解释当前的情况。

我们需要设置数据库的最大大小,这个大小是通过 API 调用提供的(所以如果 API 提供了新的大小,这可能会在运行时改变)。例如,让我们考虑最大大小为 10 MB。一旦数据库达到这个最大大小,我们需要删除一些数据库条目以便插入新条目。

在这里我有点困惑。如何在使用 Android Room 时设置数据库的最大大小,以及如何计算出我需要删除多少条目才能插入新记录并将数据库保持在允许的最大大小。

希望我很清楚,但如果需要,我可以提供更多示例。

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    就像在 android-united slack 中提到的那样,您可以通过使用抽象 dao 类作为所有 daos 的基础来实现这一点。只需在执行插入操作之前检查文件大小。仅使用 DAO:

    package com.github.fcopardo.room.base
    
    import android.arch.persistence.room.Delete
    import android.arch.persistence.room.Insert
    import android.arch.persistence.room.OnConflictStrategy
    import android.arch.persistence.room.Update
    import android.content.Context
    import java.io.File
    
    abstract class LimitedDao<T> {
    
        private var byteLimit : Long = 0
        private var context : Context? = null
        private var databaseName : String = ""
    
        public fun setByteLimit(byteLimit : Long){
            this.byteLimit = byteLimit
        }
    
        public fun setContext(context: Context?){
            this.context = context
        }
    
        public fun setDatabaseName(databaseName: String){
            this.databaseName = databaseName
        }
    
        protected fun writingCondition() : Boolean {
            var result = true
    
            if(byteLimit>0){
                var dbFile : File? = context?.getDatabasePath(databaseName)
    
                if(dbFile!=null){
                    result = dbFile.length() >byteLimit
                }
            }
    
            return result
        }
    
        @Insert
        protected abstract fun insert(data: T)
    
        public fun insertData(data:T){
            if(writingCondition()) insert(data)
        }
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        protected abstract fun persist(data: T)
    
        public fun persistData(data:T){
            if(writingCondition()) persist(data)
        }
    
        @Delete
        protected abstract fun delete(data: T)
    
        @Delete
        protected abstract fun delete(data: List<T>)
    
        @Update
        protected abstract fun update(data: T)
    
        @Update
        protected abstract fun update(data: List<T>)
    }
    

    也可以通过使用基础数据库类来实现更好的解决方案,或者您可以在视图模型级别包装此逻辑;这将使您可以安全地访问上下文,但是在视图模型之外完成的写入操作会写入数据库。完成 dao 后,请注意使用 setContext(null) 清除上下文引用。

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2014-11-18
      • 1970-01-01
      相关资源
      最近更新 更多