【问题标题】:using a Cursor to get sqllite data使用 Cursor 获取 sqlite 数据
【发布时间】:2013-05-23 19:41:01
【问题描述】:

我正在尝试使用游标获取一些数据,但我真的不知道我是否正确,因为我试图获取的数据的行和列返回 null。

这是我存储数据的地方:

   JSONArray badges = jsonObject.getJSONArray("badges");
            Log.i("badges length:",  badges.length() + "");
            for(int i = 0; i < badges.length(); i++){
                JSONObject currentBadge = badges.getJSONObject(i);
                Log.i("badge image_url:",  currentBadge.getString("image_url") + "");
                db.updateBadgesRecord(i, currentBadge.getString("id"), currentBadge.getString("name"), currentBadge.getString("description"), currentBadge.getString("image_url"), currentBadge.getString("club_id"), currentBadge.getString("created_at"));
            }

Log.i 显示有 18 个对象(行)。

这里是 updateBadgesRecord 函数:

public boolean updateBadgesRecord(long rowId, String id, String name, String description, String image_url, String club_id, String created_at) 
    {
        ContentValues args = new ContentValues();
        if(id != null){
        args.put(KEY_BADGES_ID, id);
        }
        if(name != null){
        args.put(KEY_BADGES_NAME, name);
        }
        if(description != null){
        args.put(KEY_BADGES_DESCRIPTION, description);
        }
        if(image_url != null){
        args.put(KEY_BADGES_IMAGEURL, image_url);
        }
        if(club_id != null){
        args.put(KEY_BADGES_CLUBID, club_id);
        }
        if(created_at != null){
        args.put(KEY_BADGES_CREATEDAT, created_at);
        }

        return db.update(DATABASE_TABLE_BADGES, args, KEY_ROWID + "=" + rowId, null) > 0;
    }

我认为它正在存储,但我不确定。这就是我试图显示它的方式:

public void activateBadgeList(){
        for(int i = 0; i < badgeButtons.length; i++){
            if(true){
            badgeButtons[i].setActivated(true);
            badgeButtons[i].setAlpha(1.0f);
            db.open();


            Cursor c = db.getBadgeRecord(i);
            String image_url = null;
            if (c.moveToFirst()){
                   while(!c.isAfterLast()){
                      image_url = c.getString(c.getColumnIndex(KEY_BADGES_IMAGEURL));
                      // do what ever you want here
                      c.moveToNext();
                   }
                }
                c.close();
            if(image_url != null){
            Log.i("image url", image_url);
            } else {
            Log.e("image url", "image url is null");    
            }
            badgeButtons[i] = UrlImageViewHelper.setUrlDrawable(badgeButtons[i], image_url);
            db.close();
            }
        }
    }

badgeButtons 长度为 16,所以我知道我可以轻松填充徽章.... 但是.... 图像 url 返回 null (在我的控制台中打印“图像 url 为 null 18 次”)。这是我的 getBadgeRecord 函数:

public Cursor getBadgeRecord(long rowId) throws SQLException 
{
    Cursor mCursor =
            db.query(true, DATABASE_TABLE_BADGES, new String[] {KEY_ROWID,
            KEY_BADGES_ID, KEY_BADGES_NAME, KEY_BADGES_DESCRIPTION, KEY_BADGES_IMAGEURL, KEY_BADGES_CLUBID, KEY_BADGES_CLUBID}, 
            KEY_ROWID + "=" + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

我做错了什么?请帮忙!我是新手。

谢谢!

【问题讨论】:

  • SQLiteDatabase db = this.getReadableDatabase();你有没有初始化db。如果不在 getBadgeRecord 中试试这个
  • 没有改变任何东西。我有一个名为 open() 的函数,我在其中调用 getWritableDatabase()。
  • 我会首先检查 updateBadgesRecord 实际上是否正在获取要插入的非空 imageUrl。也只是为了调试尝试调用“DatabaseUtils.dumpCurrentRowToString(Cursor c)”来查看光标中的实际内容..

标签: android sqlite cursor


【解决方案1】:

“我做错了什么”是一个广泛的要求,但这里有两点:

  1. 如果您要为列名设置一个常量,请使用它! KEY_BADGES_IMAGEURL 等于什么?我不知道,但是当您想通过cursor 查找该列中存储的内容时,您最好使用

    image_url = c.getString(c.getColumnIndex(KEY_BADGES_IMAGEURL));
    

代替:

  image_url = c.getString(c.getColumnIndex("image_url"));
  1. 进行查询时,您应该使用 ? 和提供的参数。这些会存储在 SQLite 缓存中以供查找,并且不使用参数会降低性能。

另外,这一行应该使用参数而不是

KEY_ROWID + "=" + rowID,应该是KEY_ROWID + "=?"并使用参数。

【讨论】:

  • 我认为 HaIR 意味着改变这一行:"db.update(DATABASE_TABLE_BADGES, args, KEY_ROWID + "=" + rowId, null)" 到 "db.update(DATABASE_TABLE_BADGES, args, KEY_ROWID + " = ?", new String[]{String.valueOf(rowId)})"
  • 是的 danielgrech,这就是我的意思。
  • 好吧,我试过了,但我仍然在查询中得到 0 的游标记录计数,语法为:db.query(true, DATABASE_TABLE_BADGES, new String[] {KEY_ROWID, KEY_BADGES_ID, KEY_BADGES_NAME, KEY_BADGES_DESCRIPTION, KEY_BADGES_IMAGEURL, KEY_BADGES_CLUBID, KEY_BADGES_CREATEDAT}, KEY_ROWID + "=" + rowId, null, null, null, null, null); rowId 目前在 0, 1, 2, 3...16 上测试过
【解决方案2】:

正在正确检索数据,因此我的问题的答案实际上在问题本身之内,因为它是获取数据的正确方法。问题是 db.update(...) 只更新现有行。事先做 db.insert(...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多