代码之家  ›  专栏  ›  技术社区  ›  Anthony Forloney

Android数据库错误?

  •  0
  • Anthony Forloney  · 技术社区  · 16 年前

    我的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);
    }
    

    我不记得为什么我要调用一个方法,来调用另一个方法。也许是出于绝望?但不管怎样,我要摆弄它,看看我是否清理代码,也许这样我就能回答我自己的问题。

    2 回复  |  直到 11 年前
        1
  •  2
  •   Jamie Paolino    11 年前

    不使用“删除自”命令,试试下拉表怎么样?从表中删除将创建事务日志空间。而drop table命令不会创建事务日志空间。这可能是您出错的原因。

        2
  •  0
  •   Anthony Forloney    11 年前

    我忽略了调用调用另一个方法的方法,并检查了sqliteDatabase API,发现它具有内置的删除功能:

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

    当WHERE子句删除整行时传入NULL,因此要在这里添加最后的润色,需要使用新的和改进的删除函数

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