我有一个大型数据库,我在Android上保留在内存中。有很多行,行的大小有些变化。如何在运行时确定内存数据库的大小?
答案 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");
}