确定SQLite内存数据库的大小

时间:2014-11-30 00:21:19

标签: android sqlite

我有一个大型数据库,我在Android上保留在内存中。有很多行,行的大小有些变化。如何在运行时确定内存数据库的大小?

2 个答案:

答案 0 :(得分:1)

在SQLite中,内存数据库实现为没有后备文件的页面缓存。

SQLite C API允许使用sqlite3_db_status(SQLITE_DBSTATUS_CACHE_USED)sqlte3_status(SQLITE_STATUS_PAGECACHE_USED)等函数获取状态。 但是,Android数据库API不允许访问这些功能。

答案 1 :(得分:0)

好的,这是我提出的解决方案。它不漂亮,但它有效。

Android的SQLiteDatabase类包含一个设置最大数据库大小setMaximumSize(long numBytes)的方法。最大尺寸不能设置为低于当前尺寸。因此,解决方案是将最大大小设置为页面文件大小,并查看方法返回的大小。这是我SQLiteOpenHelper课程中的方法:

public synchronized int getDatabaseUsage() {
    SQLiteDatabase db = getWritableDatabase();
    long pageSize = db.getPageSize();
    long savedMaximumSize = db.getMaximumSize();
    long appliedSize = db.setMaximumSize(pageSize);
    int percentageUsed = (int) ((appliedSize * 100) / savedMaximumSize);
    db.setMaximumSize(savedMaximumSize);
    Log.v(LOG_TAG, "Percentage database space used: " + percentageUsed);
    return percentageUsed;
}

我将最大大小设置为设备的大内存类

private static final long BYTES_IN_A_MEGABYTE = 1048576;

/**
 * Maximum size of the database in bytes
 */
private final long mMaxSize;

public SQLHelper(Context context) {
    super(context, null, null, DATABASE_VERSION);
    mMaxSize = BYTES_IN_A_MEGABYTE * Helper.getLargeMemoryClass(context);
}

public void onCreate(SQLiteDatabase db) {
    <database creation code>
    db.setMaximumSize(mMaxSize);
}

然后我在每次批量插入之前检查数据库使用情况。如果使用率高于50,我会从表中删除旧行并运行vacuum命令来恢复空间。

/**
 * Rebuilds the entire database.
 * <p/>
 * This reclaims empty space left behind after deletions.
 */
public void vacuum(SQLiteDatabase db) {
    db.execSQL("VACUUM");
}