Как установить список данных из базы данных для отображения случайным образом в Android-приложении? - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь отобразить случайные данные из примера базы данных в моей базе данных, у меня всего 20 вопросов. я хочу отображать случайным образом 10 qns каждый раз, когда я получаю доступ к приложению. И во второй раз, когда я получаю к нему доступ, он отображает остальные 10 qns, которые не отображались ранее.

мой код:

ArrayList<Integer> randList = new ArrayList<Integer>();
    Random randGenerator = new Random();

    ArrayList<String> list2 = new ArrayList<String>(db.selectData("MCQ",new String [] {"_id"}, "testId=0", null, null, null, null));

    //random 10 n.o
    for(int i=0;i<10;i++)
    {
        int randNum = randGenerator.nextInt(list2.size());

        while (randList.contains(randNum))
        {
            randNum = randGenerator.nextInt(list2.size());
        }
        randList.add(randNum);
        Log.d("rand no:"+i,String.valueOf(randNum));
    }

    ArrayList<String> idList = new ArrayList<String>();
    //get the 10 _id that are chosen
    for (int i=0; i<10;i++)
    {
        idList.add(list2.get(Integer.valueOf(randList.get(i))));
        Log.d("id:"+i,String.valueOf((list2.get(Integer.valueOf(randList.get(i))))));
    }

    ArrayList<String> list3 = new ArrayList<String>(db.selectData("MCQ",new String [] {"Question"}, null, null, null, null, null));
    Log.d("size",String.valueOf(list3.size()));
    ArrayList<String> qnsList = new ArrayList<String>();

    // == set question in arrangement of randList == //
    for(int i=0;i<=list3.size();i++)
    {
        qnsList.add(list3.get(i));
        Log.d("_id:"+i,String.valueOf(list3.get(i)));
    }

Я протестировал его снова и снова и понял, что странно, он не может прочитать данные при _id = 20

вот что я получаю в своем журнале:

E/AndroidRuntime(1284): java.lang.IndexOutOfBoundsException: Invalid index 20, size is 20
E/AndroidRuntime(1284):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)

есть и другие, но я думаю, что это бесполезно, так как я пытался запустить только с _id = 19, и это работает, но как только я перехожу на 20, он падает.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Помните, что _id в SQLite не основывается на 0.

0 голосов
/ 04 декабря 2011

Измените эту строку:

for(int i=0;i<=list3.size();i++)

на:

for(int i=0;i<list3.size();i++)

Вы повторяли цикл 1 слишком много раз (на последней итерации, когда i = list3.size() вы получите IndexOutOfBoundsException при выполнении list3.get (i), поскольку индексы списка основаны на 0, поэтому двадцатый и последний элемент фактически имеют индекс 19).

...