【问题标题】:Android cursor sometimes returns empty even when the data exists即使数据存在,Android光标有时也会返回空
【发布时间】:2015-02-28 10:31:37
【问题描述】:

我有一个 android 应用程序,它首先从网络上获取一些数据(任何可能对项目可用的更新)并写入数据,然后从数据库中读取获取的数据。 问题是在某些情况下,使用 android 游标的读取操作返回一个空游标,但我们知道数据存在,因为您在几秒钟前更新了该确切行!

事实上,您无法为某些不存在的数据请求在线更新。我搜索了很多但没有结果。我以为我可能同时阅读和写作,但事实并非如此。

下面是完成这项工作的代码:

protected Biz doInBackground(Void... params) {
            Bundle bundle = BizDetailsActivity.this.getIntent().getExtras();
            // bizID = bundle.getLong(BIZ);

            BizDataSource ds = new BizDataSource(BizDetailsActivity.this);
            ds.openWritable();
            long ID = bundle.getLong(BIZ);
            if (NetworkHelper.IsConnected(BizDetailsActivity.this)) {
                   // HERE we write data if avaiable
                    getBizOnline(ID, ds);
                }
                    //read data from database
                    biz = ds.getBiz(ID, data.getCurrentUser());
                    ds.close();
                        return biz;
}

写入/更新数据的代码:

public long updateBiz(long ID, String title, String description,
            String address, String phone, String mobile, String fax,
            String owner, long city, String website, double latitude,
            double longitude, int addDate, String expireDate, long gallery,
            String logo, float rate) {

        ContentValues values = new ContentValues();

        values.put(columns[1], title);
        values.put(columns[3], description);
        values.put(columns[4], address);
        values.put(columns[5], city);
        if (gallery > 0) {
            values.put(columns[6], gallery);
        }
        values.put(columns[7], latitude);
        values.put(columns[8], longitude);
        values.put(columns[9], phone);
        values.put(columns[10], mobile);
        values.put(columns[11], fax);
        values.put(columns[12], website);
        values.put(columns[13], owner);
        values.put(columns[14], logo);
        values.put(columns[15], addDate);
        values.put(columns[16], expireDate);
        values.put(columns[19], rate);

        long result;
        try {
            result = database.updateWithOnConflict("Bizes", values, "ID = ?",
                    new String[] { ID + "" },SQLiteDatabase.CONFLICT_FAIL);
        } catch (Exception e) {
            Log.d("UPDATE_BIZ", e.getMessage());
            result = -1;
        }
        return result;
    }

获取数据的代码:

public Biz getBiz(long id, long UserId) {
        Gallery gallery = null;
        City city = null;
        BizCategory category = null;
        Cursor c = database.query("Bizes", columns, "ID=?", new String[] { id + "" }, null, null, null);
        if (c.moveToFirst() == false) {
            // here we got empty cursor !!!!
            c.close();
            return null;
        } else {
....
}
}

【问题讨论】:

    标签: android sqlite android-asynctask cursor is-empty


    【解决方案1】:

    你能试试下面的代码来读取你的光标吗

                if(c != null){
    
                 c.moveToFirst();
    
                 while (cursor.isAfterLast() == false) {
    
                   c.moveToNext();                
                 }
    
                }
    

    【讨论】:

    • 为什么?当我跟踪代码时,显然光标不包含任何元素或行。该问题与光标或阅读方法无关。我在这个应用程序中多次使用相同的方法,所有方法都是正确的
    • 您是否尝试使用设备监视器浏览数据库并检查是否有任何实际数据?
    • 我认为问题来自碰撞或类似的事情。因为它不是每次都发生,并且通过重新安装应用程序使数据库问题消失...
    • 你认为发布你的 dbhandler 课程会有帮助吗?
    • 我想我找到了问题所在。每次我获取数据时,我都会删除旧行,它可能来自删除错误的行。因为在获取阶段我只尝试更新数据。我会检查并告诉你。感谢 cmets
    【解决方案2】:

    我发现了问题。我的删除查询是错误的,在获取数据之前已被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多