【发布时间】:2009-10-21 02:38:05
【问题描述】:
我的 Android 应用程序中有一个 MenuItem,它删除了数据库中的所有值,它更多地用于我的调试目的,一段时间后,插入虚拟值变得多余。无论如何,我已经使用 LogCat 来调试我的程序,因为它在模拟器中运行,它给了我一个错误:
Failure 21 (out of memory) on 0x0 when preparing 'DELETE FROM <MY DBTABLE>'
我可以发布代码,但我怀疑它的代码。
public void deleteAll(SQLiteDatabase db) {
try {
db.execSQL("DELETE FROM " + DATABASE_TABLE);}
Log.v(TAG, "Deleting database");
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
Log.v(TAG, "Dropping table");
onCreate(db);
Log.v(TAG, "Creating new database");}
catch (NullPointerException e) { }
catch (SQLException e) {}
}
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + DATABASE_TABLE + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "LATITUDE INTEGER NOT NULL, LONGITUDE INTEGER NOT NULL, RATING INTEGER NOT NULL)");
}
这不是我现有的功能,我最初只有:
db.execSQL("DELETE FROM " + DATABASE_TABLE);
但它不起作用,所以我将其注释掉,然后尝试先删除表并THEN创建一个新表,但每次都出现同样的错误。
有谁知道为什么会发生此错误或避免此错误的方法?
编辑: 此方法不在循环内运行,它是菜单按钮的一部分,当您选择它时,会调用 deleteAll() 方法。需要注意的是,我通过我制作的 Adapter 类调用此方法,只是为了澄清这里是我的代码的逐步执行:
private TrackerDBAdapter db;
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case VIEW_DATABASE:
Log.v(TAG, "Clicking on the view database menu option");
Toast.makeText(this, "This should show the databases.",
Toast.LENGTH_LONG).show();
return true;
case DELETE_VALUES:
Log.v(TAG, "Clicking on the delete values menu option");
db.deleteAll();
Toast.makeText(this, "Database is empty",
Toast.LENGTH_LONG).show();
return true;
}
然后在我的 TrackAdapter 类中。变量 dbhelper 是一个 DatabaseHelper 对象,它有问题中的第一个 deleteAll(SQLiteDatabase db) 代码。
private DatabaseHelper dbhelper;
private SQLiteDatabase db;
public void deleteAll() {
dbhelper.deleteAll(db);
}
我不记得为什么我调用一个方法,调用另一个方法。也许是出于绝望?但无论如何,我会摆弄它,看看我是否清理了代码,也许这样做我可以回答我自己的问题。
【问题讨论】:
-
Eeek...空“catch”块;)至少记录它们。即使它只是一种调试方法。但这不是这里的问题。表有多少行? “onCreate(db)”有什么作用?你在循环中运行它吗?请澄清。
-
静止。表有多少行?我想自己尝试一下,构建一个测试用例,看看能不能解决问题。