簡體   English   中英

Android Room,最大數據庫容量上限

[英]Android Room, Capping max database size

我正在開發生產應用程序,因此無法共享代碼。 但是,我將盡力解釋當前的情況。

我們需要設置數據庫的最大大小,此大小是通過API調用提供的(因此,如果API提供了新的大小,則此大小可能會在運行時更改)。 例如,讓我們考慮最大大小為10 MB。 數據庫達到此最大大小后,我們需要刪除一些數據庫條目,以便可以插入新條目。

在這里我有點困惑。 如何在使用Android Room時設置數據庫的最大大小,以及如何確定需要刪除多少條目才能插入新記錄並保持數據庫處於允許的最大大小。

希望我很清楚,但是如果需要,我可以提供其他示例。

就像android-united松弛中提到的那樣,您可以通過使用抽象的dao類作為所有dao的基礎來完成此操作。 只需在執行插入操作之前檢查文件大小即可。 僅使用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>)
}

也可以通過使用基礎數據庫類來實現更好的解決方案,或者可以將這種邏輯包裝在viewmodel級別上。 這將使您可以安全地訪問上下文,但是在viewmodel外部完成的寫操作將寫到數據庫。 完成dao時,請注意使用setContext(null)清除上下文引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM