制作更好的android sqlite查询

时间:2012-02-20 19:08:22

标签: java android database sqlite

目前我有一个查看表并返回最新行的查询,读取该行并将字符串设置为所选列索引中的值。

目前我有9列,所以我最终只返回9个方法来返回每个列,只返回一个字符串并将其设置为每个单独的textview。

我是否设置光标以返回行,然后在设置textviews时设置列索引。像

这样的东西
            cursor.getString(1)

这是我当前的查询

            public String getName() {
    // TODO Auto-generated method stub
    String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_COLUMN2,
            KEY_COLUMN3, KEY_COLUMN4, KEY_COLUMN5, KEY_COLUMN6, KEY_COLUMN7, KEY_COLUMN8 };
    Cursor c = mDb.query(true, DATABASE_TABLE, columns, null, null, null,
            null, "_id DESC", "1");

    if (c != null) {
        c.moveToFirst();
        String name = c.getString(1);
        return name;
    }

    return null;
}

1 个答案:

答案 0 :(得分:2)

您可以轻松地将getName()更改为与字段无关的内容,例如:

public String getField(String fieldName) {
    ...
    String s = cursor.getString(cursor.getColumnIndexOrThrow(fieldName));
}

并使用它:

String s = mDb.getField(mDb.KEY_NAME);

此方法的一个问题是您不能将getString()用于数字列,因此您最终会为表中支持的每种数据类型使用多种方法。解决这个问题的方法是查看游标的getType()方法,或者只是从数据库访问方法返回一个完整的数据结构。说你有:

DB Column        Field Type
FOO              varchar
BAR              integer
BAZ              varchar

如果你定义一个类,比如MyRowMapper,你可以这样做:

public MyRowMapper getRow(String... queryParameters) {
    //query table based on queryParameters
    MyRowMapper mapper = null;
    if (cursor.moveToFirst()) {
        String foo = cursor.getString(cursor.getColumnIndexOrThrow("FOO"));
        Integer bar = cursor.getInteger(cursor.getColumnIndexOrThrow("BAR"));
        String baz = cursor.getString(cursor.getColumnIndexOrThrow("BAZ"));

        mapper = new MyRowMapper(foo, bar, baz);            
    }
    cursor.close(); // NEVER FORGET TO CLOSE YOUR CURSOR!
    return mapper;
 }

这只是抽象的邮件编码,因此请使用一粒盐合成语。但希望你明白了。