一次获得1个条目

时间:2014-09-19 08:28:22

标签: android sqlite

我要做的是逐个获取条目,这是代码。

Teams.Java
public String getData(String key) {
        // TODO Auto-generated method stub
        String[] columns = new String[] { Key };
        Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
                null, null);
        String result = "";
        int iName = c.getColumnIndex(Key);
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            result = result + "," + c.getString(iName);

        }
        return result;
    }

活动

MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView t1 = (TextView) findViewById(R.id.tvINames);
        Teams stat = new Teams(this);
        stat.open();
        String Names = stat.getName("KEY_TEAMS");
        stat.close();
        t1.setText(Names);

如果需要logcat,请告诉我。

1 个答案:

答案 0 :(得分:0)

首先,行上的'Key':

String[] columns = new String[] { Key };

int iName = c.getColumnIndex(Key);

使用大写'K',因为method-header中的参数以普通'k'命名:

public String getData(String key) {

您是否在Teams.java中定义了名为“Key”的字段? 我可以想象这不会导致代码的预期行为,因为甚至没有使用该参数。

我肯定会改变的另一件事是使用StringBuilder(或StringBuffer,如果必须是线程安全的)来连接getData()方法中的字符串。

为了迭代游标我只会使用:

while (c.moveToNext()) {
    ...
}

以下一行存在另一个不一致之处:

String Names = stat.getName("KEY_TEAMS");

你正在调用另一种方法而不是显示的getData(String key)-method。


如果我可以重写你的方法,我会建议这样的事情:

//Teams.Java
public String getData(String key) {

    String[] columns = new String[] { key };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    final int iName = c.getColumnIndex(key);

    StringBuilder result = new StringBuilder();
    while (c.moveToNext()) {
        result.append(c.getString(iName));
        result.append(",");
    }

    return result.toString();
}

AND

//MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Teams stat = new Teams(this);

    try {
        stat.open();

        TextView t1 = (TextView) findViewById(R.id.tvINames);
        t1.setText(stat.getData("KEY_TEAMS"));
    } catch (Exception e) {
        Log.e(MainActivity.class.getSimpleName(), "some meaningful error message 42!", e);
    } finally {
        stat.close();
    }

}

一般来说,将游标的所有访问权限包装到try-catch-finally块中是一个非常好的主意,以确保它在任何情况下都是关闭的!