Android:数据库删除不起作用。在调试器中跳过函数调用

时间:2011-10-31 20:40:32

标签: java android debugging

我已经编写了一个数据库管理器来处理我的Android应用程序中的查询,而我用来删除行的函数做了一些奇怪的事情。这是功能:

public synchronized boolean removeChannel(String channel_name) {
        IMrekMessageDbAdapter messageAdapter = new IMrekMessageDbAdapter(this.context);
        messageAdapter.open();
        long id = getChannelId(channel_name);
        if (!messageAdapter.clearChannel(id)) {
            // return false if we can't clear the messages for the channel
            // this likely means that the channel doesn't actually exist and something
            // is messed up.
            return false;
        }
        boolean ret = database.delete(DATABASE_TABLE, KEY_ID + " = ?", new String[]{((Long)id).toString()}) > 0;
        return ret;
    }

现在,使用这样的代码,它会命中if为什么评估为false,因此跳过它。但是它会跳过ret的赋值并转到return语句(因此也会跳过database.delete()调用。调试器也不会在范围中显示ret

另一个问题指出,由于Android编译器优化字节码的方式,有时它可能会跳过行,因为这是它真正追踪的而不是java。但是,如果我将return false;内的database.delete()注释掉,则不会跳过ret调用/分配给return。它确实删除了应该删除的行。

我的问题基本上是:为什么它会跳过函数的其余部分,因为if块中的{{1}}语句没有被执行?

1 个答案:

答案 0 :(得分:0)

事实证明,这是因为if内部的return语句。我了解到你总是应该在函数中有一个return语句。如此处所示,拥有其他人可能会导致问题。尽管没有进入if区块,但它正在执行第一次返回。