我的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);
但它不起作用,所以我把它注释掉,然后试着先把桌子放下,然后
然后
创建一个新表,但每次都有相同的错误。
是否有人知道发生此错误的原因或此错误不发生的方法?
编辑:
此方法不在循环内运行,循环是菜单按钮的一部分,当您选择它时,它将调用deleteall()方法。需要注意的是,我通过我所做的一个适配器类调用这个方法,只是为了澄清以下是我的代码的步骤:
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);
}
我不记得为什么我要调用一个方法,来调用另一个方法。也许是出于绝望?但不管怎样,我要摆弄它,看看我是否清理代码,也许这样我就能回答我自己的问题。