数据库忽略列中具有相同值的行 - Android

时间:2017-06-12 01:19:40

标签: java android mysql database sqlite

我正在使用一个包含两列的表填充RecyclerView,它基本上是一个字典,当我调用该方法开始填充异常情况时,代码会忽略第一列中具有相同值的行" COL1"然后得到最后一个并移动到下一个等等

JAVA

public void fetchData()
{
    db =new DataBaseHelper(getContext());
    try {

        db.createDataBase();
        db.openDataBase();

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    namelist=new LinkedHashMap<>();
    int ii;
    SQLiteDatabase sd = db.getReadableDatabase();
    Cursor cursor = sd.query("dictionary_lib" ,null, null, null, null, null, null);
    ii=cursor.getColumnIndex("English_lib");
    eng_list=new ArrayList<String>();
    nor_list= new ArrayList<String>();
    while (cursor.moveToNext()){
        namelist.put(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));
    }
    Iterator entries = namelist.entrySet().iterator();
    while (entries.hasNext()) {
        Map.Entry thisEntry = (Map.Entry) entries.next();
        eng_list.add(String.valueOf(thisEntry.getKey()));
        german_list.add(String.valueOf(thisEntry.getValue()));
    }

    for (int i = 0; i < eng_list.size(); i++) {
        data.add(new DictObjectModel(eng_list.get(i), german_list.get(i)));
    }
    adapter = new CustomAdapter(data);
    rv.setAdapter(adapter);
}

数据库的例子

这里的recyclerview将忽略前两行alpha并打印第三行并移动到下一行

enter image description here

1 个答案:

答案 0 :(得分:1)

这实际上很可能是因为您将值放在 LinkedHashMap中,该{{3}}实现了地图接口的状态

  

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射一个值。

您正在此处检索重复的密钥:

while (cursor.moveToNext()){
    namelist.put(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));
}

因此,当密钥"alpha"重复时,前两个示例值将替换为映射。

要验证这一点,您可以打印出来或跳过上面循环中的值。

解决此问题的一种方法是创建自己的java对象:

public class Example
{
    public String col1; // but appropriate names
    public String col2; 

    // Add constructors or getters and setting if you want private members
}

然后在循环中使用Arraylist

List<Example> rows = new ArrayList<>;
while (cursor.moveToNext()){
    Example e = new Example();
    e.col1 = cursor.getString(ii);
    e.col2 = cursor.getString(cursor.getColumnIndex("German_lib"))
    rows.add(e)
}

修改

您正在创建多个循环以获得相同的结果。所以你可以在光标循环中放入

data.add(new DictObjectModel(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));