我有一个应用程序,需要将许多字符串写入Sqlite数据库。在测试期间,我注意到抛出致命异常错误:“由于db大小总是大于2000000 ,因此无法分配游标窗口”,如下面的链接所示,因为Sqlite数据库对象大小增长到超过2兆字节。
CursorWindow can not be allocated because of database size more than 2000000 bytes 在下面的方法中,cursor.moveToFirst()始终抛出异常:
public boolean doesBusinessExist(Business_4s business)
{
//
boolean businessExists = false;
//
if(business != null) {
//
String query = "Select " + COLUMN_ID + " FROM " + TABLE_BUSINESS + " WHERE " + COLUMN_ID + " = \"" + business.get_id() + "\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
//
try {
//
if (cursor != null && cursor.moveToFirst()) {
cursor.moveToFirst();
//want to know how many business are there
int cnt = cursor.getCount();
//return true
if (cnt > 0) {
businessExists = true;
}
} else {
businessExists = false;
}
//
} finally {
cursor.close();
db.close();
}
}
//
//final return
return businessExists;
//
}
所以我决定编写一些代码,当db接近2兆字节时不再添加更多数据,再次研究如何计算sqlite db size 并找到两种方法:< / p>
方法1:
File f = getDatabasePath("businessDB.db");
long dbSize = f.length();
此方法中的dbSize值为:53248字节
方法2:
dbHandler = new MyDBHandler_bus_4s(getApplicationContext(),null);
SQLiteDatabase db_ = dbHandler.getWritableDatabase();
long size = new File(db_.getPath()).length();
此方法中的大小值为:53248字节
鉴于db大小计算为53248字节,我的计算中缺少一些东西,因为我确定此时db大小接近2000000字节,那么在android中计算Sqlite数据库大小的正确方法是什么? / p>
答案 0 :(得分:0)
对于未来的旅行者:
根据我的观察,某个软件包的所有 SQLite DB的总大小不能超过2MB(至少默认情况下)。我的应用程序有5个SQLite数据库,随着时间的推移,这些数据库的总大小往往会超过2 MB。 实施的解决方法是使用Alarm Manger设置清理服务,以定期维护数据库中的记录数。
我是怎么知道的?在有根电话上安装this app并导航到本地&gt;设备&gt;数据&gt;数据&gt; [应用包名称]&gt;数据库
对于每个数据库,还有另一个带有.db-journal扩展名的文件,该文件的大小通常比实际数据库小,但也占用了一些空间。