从android sqlite数据库中为应用程序选择所有行时,它将返回所有条目的最后一个条目

时间:2011-09-29 15:55:59

标签: android sqlite select

我目前正在开发一个Android应用程序。我有一个sqlite数据库,它在四列中存储文本(我只是在我的应用程序中用作字符串)。我试图从表中返回所有行和列。我已经创建并将数据插入表中,并使用adb shell中的sqlite3验证它是否存在。我使用与我在程序中使用的语句相同的语句,它返回包含所有正确数据的所有行。在我的程序中,我通过遍历游标以ArrayList<ArrayList<String>>格式存储所有数据。它返回与行对应的正确ArrayList<String>个数,但它们都只有最后一行的信息。这是我的代码:

private static final String SELECT = "SELECT * FROM " + TABLE_NAME;

public ArrayList<ArrayList<String>> allRecipes()
{
    ArrayList<ArrayList<String>> results = new ArrayList<ArrayList<String>>();
    ArrayList<String> recipe = new ArrayList<String>();
    Cursor cursor = db.rawQuery(SELECT, null);
    if(cursor.moveToFirst())
    {
        do
        {
            recipe.clear();
            recipe.add(cursor.getString(1));
            recipe.add(cursor.getString(2));
            recipe.add(cursor.getString(3));
            recipe.add(cursor.getString(4));
            results.add(recipe);
        }while(cursor.moveToNext());
        if(cursor != null && !cursor.isClosed())
            cursor.close();
    }
    return results;
}

然后我遍历程序的另一部分中的ArrayLists,并且包含的​​所有信息只是输入表中的最后一行的重复。我一收到它就检查了我的其他方法中的ArrayLists,它们都是一样的,所以我假设它必定是这个代码段中的一个问题。我也尝试了使用group by和order by子句的select语句,但它仍然不起作用。使用带有正确参数的db.query()会导致同样的问题。

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您在数组列表中添加了配方的链接,并在周期的每次迭代中更改了配方的值。

您应该将代码更改为此

public ArrayList<ArrayList<String>> allRecipes()
{
   ArrayList<ArrayList<String>> results = new ArrayList<ArrayList<String>>();
   Cursor cursor = db.rawQuery(SELECT, null);
   if(cursor.moveToFirst())
   {
       do
       {
           ArrayList<String> recipe = new ArrayList<String>();
           recipe.add(cursor.getString(1));
           recipe.add(cursor.getString(2));
           recipe.add(cursor.getString(3));
           recipe.add(cursor.getString(4));
           results.add(recipe);
       }while(cursor.moveToNext());
       if(cursor != null && !cursor.isClosed())
          cursor.close();
   }
   return results;
}