我有5个空文本视图,我在其中添加名称。添加名称后,它将存储在数据库中。数据库由2列组成,即项目ID和项目NAME。这是我正在做的一个例子:
- Mark1 //ID=1, NAME= Mark1
- Mark2 //ID=2, NAME= Mark2
- Mark3 //ID=3, NAME= Mark3
- Empty
- Empty
我完全添加和编辑textViews,但我在删除时遇到问题。这与我从数据库中获取值的方式有关,我将解释:
每次应用程序启动,或者我编辑,添加或删除一个元素时,我所做的就是从数据库中获取项目,将它们放入Map中,然后将它们复制到textviews中(第一次看不到它们) )只显示已设置名称的那些。
这是我用来做的代码:
public void getTravelers() {
/*Create map where store items*/
Map<Integer, String> nameList = new HashMap<Integer, String>();
/*Lon in providers query() method to get database's items and save them into the map*/
Cursor c = getContentResolver().query(TravelersProvider.CONTENT_URI, PROJECTION, null, null, null);
if (c.moveToFirst()) {
do {
nameList.put(Integer.parseInt(c.getString(c.getColumnIndex(Travelers._ID))), c.getString(c.getColumnIndex(Travelers.NAME)));
}while(c.moveToNext());
}
if (c != null && !c.isClosed()) {
c.close();
}
/*Check size*/
int size = nameList.size();
if (size >= 1) {
/*Save items in TextViews*/
//TODO: This is the code I should fix
for (int i = 0; i <= size; i++) {
if (i==1) {
traveler1.setText(nameList.get(i).toString());
traveler1.setVisibility(View.VISIBLE);
}
if (i==2) {
traveler2.setText(nameList.get(i).toString());
traveler2.setVisibility(View.VISIBLE);
}
if (i==3) {
traveler3.setText(nameList.get(i).toString());
traveler3.setVisibility(View.VISIBLE);
}
if (i==4) {
traveler4.setText(nameList.get(i).toString());
traveler4.setVisibility(View.VISIBLE);
}
if (i==5) {
traveler5.setText(nameList.get(i).toString());
traveler5.setVisibility(View.VISIBLE);
}
}
}
}
问题出现在for循环中。让我们来自上面提到的项目,我想删除ID = 2的Mark2
,那么新Map的大小将是2,它将进入(i == 1)
并且(i == 2)
。但是当进入最后一个时,它会执行 traveler2.setText(nameList.get( 2 )。toString()); 并且如图所示,没有元素存在ID = 2,因为那是我删除的,它会抛出一个NPE。
所以我的问题是,如果不面对这个问题,这样做的正确方法是什么?
答案 0 :(得分:0)
你应该选择除for循环之外的switch case。代码不会循环。
答案 1 :(得分:0)
最后,我得到了我需要的只是更改Map的Key值,它与数据库的ID相同:
if (c.moveToFirst()) {
int key = 0;
do {
key++;
nameList.put(key, c.getString(c.getColumnIndex(Travelers.NAME)));
}while(c.moveToNext());
}
if (c != null && !c.isClosed()) {
c.close();
}
基本上这种方式我不需要再改变了,因为现在Map的键值将与Textview位置匹配