【问题标题】:Android Database error?Android数据库错误?
【发布时间】: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)”有什么作用?你在循环中运行它吗?请澄清。
  • 静止。表有多少行?我想自己尝试一下,构建一个测试用例,看看能不能解决问题。

标签: sql android database


【解决方案1】:

不使用 Delete From 试试 DROP TABLE 怎么样?从表中删除将创建事务日志空间。而 DROP TABLE 命令不会创建事务日志空间。这可能是您的错误的原因。

【讨论】:

    【解决方案2】:

    我忽略了调用另一个方法的方法并检查了 SQLiteDatabase API 并看到它具有内置的删除功能:

    delete(String tableName, String[] whereClause, String whereArgs) {}
    

    在 whereClause 中传入 null 会删除整行,所以在这里添加收尾的是新的和改进的删除功能

    public boolean deleteAll() {
        try {
            open();
        }
        catch (SQLException e) {
            Log.v(DatabaseHelper.TAG, "SQLException caught");
        }
    
        return db.delete(DatabaseHelper.DATABASE_TABLE, null, null) > 0;
    }
    

    【讨论】:

    • 这是否意味着您仍然收到错误?或者它是固定的?关于异常记录,请考虑至少附加“e.getMessage()”。没有它,它与写“未知错误!”或“哎呀!”几乎相同。这不会帮助您进行调试。
    • 它已完全修复,是的,这是添加异常的好点,我正计划重写内容,目前我发布时可能有 13 行。祝你好运,谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多