【问题标题】:Array method returning Array, only first value?数组方法返回数组,只有第一个值?
【发布时间】:2012-01-01 19:44:00
【问题描述】:

我正在尝试从 sqlLite DB 获取列数据并将该数据放入一个数组方法中,然后调用该方法并显示数据,由于某种原因,我只获得了列中的第一个变量,请帮助!!! !

-是的,该列中有更多变量

    public String[] getScore01() {

    String[] column1 = new String[] { KEY_NAME };
    Cursor c = ourDatabase.query(DATABASE_TABLE, column1, null, null, null,
            null, null);
    String[] result = {};

    int iName = c.getColumnIndex(KEY_NAME);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

        String[] result1 = { "" + c.getString(iName) };

        result = result1.clone();
    }
    return result;
}

这里我们调用该方法并将数据设置为一个数组...

        Database info = new Database(this);

    info.open();
    String[] data = info.getScore01().clone();
    info.close();

将 textview tvVVTEST 设置为 data[0] 有效,但将其设置为 data[1] 或其他任何内容都会失败,为什么???

        tvVVTEST.setText("" + data[0]); //works
      //tvVVTEST.setText("" + data[1]); // Does Not Work

【问题讨论】:

  • 在那个 for 循环中,打印 result1[0] 并查看每次迭代中存储的内容,您将确切知道发生了什么

标签: android arrays sqlite methods


【解决方案1】:

看看这个循环:

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

    String[] result1 = { "" + c.getString(iName) };

    result = result1.clone();
}
return result;

您只是将result1 设置为单个元素数组,然后将result 设置为该数组的克隆。因此result 只会引用一个单元素数组。我建议你改用List<String>

List<String> results = new ArrayList<String>();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
    results.add(c.getString(iName));
}
return results;

(更改您的方法以声明它也返回List&lt;String&gt;。)

你应该可以使用

List<String> data = info.getScore01();
tvVVTest.setText(data.get(1)); // Assuming there *is* a second element

顺便说一句,您似乎在任何需要字符串的地方都使用"" + x。即使x 不是 字符串,这也是个坏主意 - 请改用String.valueOf(x) - 但当x 是字符串时,情况会更糟。

您也不需要到处克隆数组(或列表)。哦,你应该把info.close()方法放在finally块中,这样即使抛出异常也可以关闭数据库。

【讨论】:

  • 这行得通,但问题是我需要一个数组(因为我将我正在获取的数组放入列表视图中)我想我可以将列表数组数据转换为数组?
  • @FC_Inter_Fan:你真的需要将它作为数组而不是列表放入吗?如果是这样,您可以致电list.toArray(new String[0]) - 但如果可能的话,我会尽量避免直接使用该数组。
  • 我需要一个数组来执行此操作: lviewAdapter = new ListViewAdapter(this, data, number); list.setAdapter(lviewAdapter); lviewAdapter.notifyDataSetChanged();尝试将数据库中 2 个不同列的数据显示在数组列表中
【解决方案2】:
info.open();
String[] data = info.getScore01().clone();
info.close();

不需要这样打电话。将其更改为

info.open();
String[] data = info.getScore01();
info.close();

你已经声明了两次结果。第二次确保数组值每次都会插入到新的位置。否则它会覆盖,你只会得到一个值

已编辑 循环内部更改为

where you declare String [] result, Change to String []result=new String[c.getCount()];
 int i=0;
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

    result1[i] = c.getString(iName);
    i++;
}
return result;

【讨论】:

  • 我已经编辑过检查一次。如果解决了问题,请将其标记为答案
【解决方案3】:

添加以下内容:

System.out.println(data.length);

如果是一个,那么您的数组中可能只有一个元素。

【讨论】:

    【解决方案4】:

    如果你可以使用 for() 语法,我就知道了。如果你改用 while 循环会发生什么?

    while( c.moveToNext() ) { 
    

    【讨论】:

    • 再次返回 1 个元素;/
    • 您认为for 语法有什么问题?在我看来完全正常:初始化、条件、迭代后操作。
    猜你喜欢
    • 2021-08-22
    • 2011-11-05
    • 2019-07-21
    • 1970-01-01
    • 2011-07-12
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多