我的头衔可能看起来有点不合适,但我真的不知道如何制定这个问题。
基本上我有一个包含三列的数据库,其中包含文本字段。
我想从单个列中提取所有值,并将它们分组为一个巨大的字符串,同时用\ n分隔它们。
最后三个字符串应存储在单个String数组中。 所以我决定使用三个列名查询DB并遍历整个表:
String[] columns = new String[] {KEY_DESCRIPTION, KEY_REPS, KEY_WEIGHT};
Cursor c = sqlDB.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result[] = new String[3];
int iDesc = c.getColumnIndex(KEY_DESCRIPTION);
int iReps = c.getColumnIndex(KEY_REPS);
int iWeight = c.getColumnIndex(KEY_WEIGHT);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) //loop thru
{
result[0] = result[0] + c.getString(iDesc) + "\n";
result[1] = result[1] + c.getString(iReps) + "\n";
result[2] = result[2] + c.getString(iWeight) + "\n";
}
return result;
我之前使用类似的方法来连接所有三个字符串,但现在我需要在这三个值之间进行某种分离。
检索值后,我想将它们分别插入到Android TextViews中:
TextView1.setText(串[0]);
TextView2.setText(串[1]);
TextView3.setText(字符串[2]);
所以我的实际问题是我应该继续使用它还是应该选择其他方式,例如每个字符串一个数组列表等等?
答案 0 :(得分:0)
你可以编写一个小的(私有内部)类来保存这三个字符串并给它们一个有意义的名字。有可能当你回到你的代码时,你将不记得索引的含义:
class Data{
public String description = "";
public String reps = "";
public String weight = "";
}
现在,您可以写下这样的内容:
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result.desciption += c.getString(iDesc) + "\n";
result.reps += c.getString(iReps) + "\n";
result.weight += c.getString(iWeight) + "\n";
}
// ...
TextView1.setText(result.description);
TextView2.setText(result.reps);
TextView3.setText(result.weight);
关于效率的一句话:连接这样的字符串非常慢。您需要使用StringBuilder
代替。请参阅:Is string concatenaion really that slow?
答案 1 :(得分:0)
我的建议是停止使用Arrays
(如[]中所示)并尽可能移至ArrayList
。由于ArrayList
是动态的,您可以继续添加数据。因此不需要使用/ n分开。将结果更改为2维ArrayList
或为每列创建3个单独的ArrayList
。然后像
ResultsIdesc.add(c.getString(iDesc));
ResultsiReps.add(c.getString(iReps));
这样可以更轻松地将每个文字写入文本视图。