删除时更新项目ID

时间:2014-05-30 09:22:45

标签: android mysql

我有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。

所以我的问题是,如果不面对这个问题,这样做的正确方法是什么?

2 个答案:

答案 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位置匹配