Android: неповторяющийся SQLite Random () Query - PullRequest
0 голосов
/ 10 июня 2011

Мне нужно отобразить 3 случайных изображения из моей базы данных sqlite по горизонтали. Поскольку невозможно сделать горизонтальный ListView, я манипулировал своим способом, сделав 3 ListViews рядом друг с другом внутри горизонтальной LinearLayout.

Итак, я сейчас использую этот метод:

final ListView g = (ListView)findViewById(R.id.lstText1);
final ListView h = (ListView)findViewById(R.id.lstText2);
final ListView i = (ListView)findViewById(R.id.lstText3);

    g.setOnItemClickListener(this);
    h.setOnItemClickListener(this);
    i.setOnItemClickListener(this);
// Set the adapter to our custom adapter (below)

g.setAdapter(new MySimpleCursorAdapter(this, R.layout.toplist,
            managedQuery(Uri.withAppendedPath(Provider.CONTENT_URI,
                    Database.Project.NAME), new String[] { BaseColumns._ID,
                    Database.Project.C_SMALLIMAGE}, null, null, "RANDOM() LIMIT 1"),
            new String[] { Database.Project.C_SMALLIMAGE }, new int[] {R.id.image1}));

h.setAdapter(new MySimpleCursorAdapter(this, R.layout.toplist,
            managedQuery(Uri.withAppendedPath(Provider.CONTENT_URI,
                    Database.Project.NAME), new String[] { BaseColumns._ID,
                    Database.Project.C_SMALLIMAGE}, null, null, "RANDOM() LIMIT 1"),
            new String[] { Database.Project.C_SMALLIMAGE }, new int[] {R.id.image1}));

i.setAdapter(new MySimpleCursorAdapter(this, R.layout.toplist,
            managedQuery(Uri.withAppendedPath(Provider.CONTENT_URI,
                    Database.Project.NAME), new String[] { BaseColumns._ID,
                    Database.Project.C_SMALLIMAGE}, null, null, "RANDOM() LIMIT 1"),
            new String[] { Database.Project.C_SMALLIMAGE }, new int[] {R.id.image1}));

Все работает отлично по порядку, за исключением того, что показанные случайным образом изображения должны различаться между собой. С моим методом выше, так как я использую 3 разных ListViews, иногда они показывают одинаковые случайные изображения.

Кто-нибудь может дать мне решение моей проблемы? возможно, изменив эту строку "RANDOM() LIMIT 1" или еще, я в любом случае открыт для любых решений.

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

Недавно я работал над чем-то похожим для проекта iPhone, в котором также используется SQLite.

Взгляните на следующие два вопроса, которые я задал, и я подозреваю, что они отвечают на ваши попытки.

Советы по оптимизации оператора SQLite select

и

SQLite Выбор данных из нескольких строк, возвращаемых как одна строка

1 голос
/ 10 июня 2011

FSM спасите нас ... вы все еще здесь

ListView для одного элемента - плохая идея

просто поместите 3 ImagesView в Layout и сделайте что-то подобное

final ImageView[] images = new ImageView[3];
ImageLoader loader = new ImageLoader(this);

images[0] = (ImageView)findViewById(R.id.imageView1);
images[1] = (ImageView)findViewById(R.id.imageView2);
images[2] = (ImageView)findViewById(R.id.imageView3);

int counter = 0;

    Cursor c = managedQuery(Uri.withAppendedPath(Provider.CONTENT_URI,
                    Database.Project.NAME), new String[] { BaseColumns._ID,
                    Database.Project.C_SMALLIMAGE}, null, null, "RANDOM() LIMIT 3");
  if(c!=null && c.moveToFirst()){
     do{
       String url = c.getString(1);
       images[counter].setTag(url);
       loader.DisplayImage(url, this, images[counter]);
       counter++;
     }while(c.moveToNext());
  }
0 голосов
/ 10 июня 2011

Получите количество строк, выберите случайные числа в диапазоне от 0 до rowcount-1 на клиенте, затем используйте LIMIT, чтобы выбрать n-ую строку ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...