代码之家  ›  专栏  ›  技术社区  ›  xZise

游标找不到列?

  •  1
  • xZise  · 技术社区  · 15 年前

    有缺陷的代码:

    public final AccessToken[] fetchAccessTokenByServerId(final long serverId) {
        final Cursor c = db.query(
                ACCESS_TOKEN_TABLE,
                new String[] { ACCESS_TOKEN_COL_ID, ACCESS_TOKEN_COL_VALUE },
                ACCESS_TOKEN_COL_SERVER_ID + "=?",
                new String[] { Long.toString(serverId) },
                null,
                null,
                null);
    
        AccessToken[] result = new AccessToken[c.getCount()];
        for (int i = 0; i < result.length; i++) {
            long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
            String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));
    
            result[i] = new AccessToken(value, id, serverId);
            c.moveToNext();
        }
        return result;
    }
    
    public static final String COL_ID = "_id";
    public static final String ACCESS_TOKEN_TABLE = "accesstoken";
    public static final String ACCESS_TOKEN_COL_ID = COL_ID;
    public static final String ACCESS_TOKEN_COL_SERVER_ID = "server_id";
    public static final String ACCESS_TOKEN_COL_VALUE = "value";
    

    但是for循环中的前两个语句失败:

    请求索引-1,大小为

    表存在列:yId(=int)、ServyId(= int)和值(=字符串)

    有一个条目:1,1,test

    真诚的 西泽

    2 回复  |  直到 15 年前
        1
  •  3
  •   Cristian    15 年前

    初始化光标后,请执行以下操作:

    c.moveToFirst();
    
        2
  •  2
  •   t0mm13b    15 年前

    原件:

    AccessToken[] result = new AccessToken[c.getCount()];
    for (int i = 0; i < result.length; i++) {
        long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
        String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));
    
        result[i] = new AccessToken(value, id, serverId);
        c.moveToNext();
    }
    

    被改进的:

    if (c.moveToFirst()){
       int rowCount = c.getCount();
       AccessToken[] result = new AccessToken(rowCount);
       int recCount = 0;
       while (!c.isAfterLast()){
            long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
            String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));
    
            result[recCount++] = new AccessToken(value, id, serverId);
            c.moveToNext();
       }
       c.close(); // <-- IMPORTANT!!!!
    }
    
    推荐文章