ListView从SQLite返回相同记录的多个条目

时间:2012-01-14 18:07:21

标签: android sqlite cursor

我不完全确定我的代码的哪一部分正在实现这一点。这是我第一次使用Android编写SQLite编码,我使用ContentValues将记录输入数据库。我没有得到任何错误或任何数据,并且数据被正确插入,但是当我从数据库中提取数据时,我为每条记录获取了5个ListView条目。我要么误解了在使用ContentValues和.insert将数据放入数据库时​​输入数据的方式,要么在从数据库中检索数据时做错了。

以下是我用于将数据插入数据库的代码。

DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getWritableDatabase();

    ContentValues cv=new ContentValues();

    cv.put(myName, titleText);
    cv.put(myFileName, filenameText);
    cv.put(myRecDate, recordedText);
    cv.put(myPubDate, publishedText);
    cv.put(myDescription, DescriptionText);

    database.insert(myTable, castName, cv);
    database.insert(myTable, castFileName, cv);
    database.insert(myTable, castRecDate, cv);
    database.insert(myTable, castPubDate, cv);
    database.insert(myTable, castDescription, cv);

    database.close();

这是我填充ListView的代码。

DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getWritableDatabase();
    Cursor data = database.query("myDb", fields, null, null, null, null, null);
    dataSource = new SimpleCursorAdapter(this, R.layout.row, data, fields, new int[] {R.id.idText, R.id.name, R.id.description});

    final ListView view = getListView();

    view.setHeaderDividersEnabled(true);
    view.addHeaderView(getLayoutInflater().inflate(R.layout.row, null));
    setListAdapter(dataSource);

    database.close();

由于数据已成功插入,我认为我的DatabaseHelper类没有任何问题。非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

ContentValues应该代表单个记录。所以你有这个部分来自你的对象创建记录。这些应该是列名到列值的映射。

cv.put(myName, titleText);
cv.put(myFileName, filenameText);
cv.put(myRecDate, recordedText);
cv.put(myPubDate, publishedText);
cv.put(myDescription, DescriptionText);

然后在这里你插入相同的记录5次。我假设你的第二个参数是列名。

database.insert(myTable, castName, cv);
database.insert(myTable, castFileName, cv);
database.insert(myTable, castRecDate, cv);
database.insert(myTable, castPubDate, cv);
database.insert(myTable, castDescription, cv);

在Android中,你只需要指定表名,在这种情况下是myTable,第二个参数应该是null,最后一个参数应该是ContentValues对象。

所以正确的方法是:

ContentValues cv = new ContentValues();
cv.put(nameColumn, nameValue);
cv.put(fileNameColumn, fileNameValue);
... etc ...

database.insert(tableName, null, cv);

答案 1 :(得分:1)

看起来你正在为每列调用insert()。将列值放入ContentValues对象中,并使用列名称的ID。然后拨打

database.insert(myTable, null, cv);

只有一次。