Cursor и выборка значений

334
14 февраля 2017, 18:22

Продолжаю рубрику безответных вопросов на Stack overflow.

Имеем: DB.java

Cursor Positions (String str){
  NAME = str;
  cursor = mDB.rawQuery("SELECT * FROM TABLE", null);
  result = cursor.getColumnCount();
  cursor.moveToFirst();
  for (int k = 1; k < result; k++) {
      cur = DB.rawQuery("SELECT _id," + NAME + " FROM TABLE WHERE A" + k + " = 1", null);
  }  
  return cur;
  }

Дано: NAME задаём сами, в данном случае я поставил BIT для удобства, n - аналогично.

MainActivity.java

                            cur4 = DB.Positions("BIT");
                            List<String>lt2 = new ArrayList<String>();
                            String add2 = null;
                            cur4.moveToFirst();
                            for (int i = 0; i < cur4.getColumnCount(); i++) {
                                add2 = cur4.getString(i);
                                lt2.add(add2);
                            }
                            ad2 = new ArrayAdapter<String>(getActivity(),R.layout.my_textview, lt2);
                            lv1.setAdapter(ad2);

Строку BIT необходимо записать в cursor с Ak = 1.
Предположим в в таблице содержится строка 0 1 0 1 1 0 0 0, после неизвестных мне манипуляций, мы получим cursor 1 1 1, что будет соответствовать А2, А4, А5.
Вариант реализации через List я уже практиковал, совсем недавно мне сказали, что данный метод, мягко говоря, ложный (через List несерьёзно работать с ListView, работай через cursor). Поэтому сам вопрос, как это реализовать?

Answer 1
  1. База данных не работает так, как вы ожидаете. Выбраны могут быть только строки, соответствующие условию, и для всех отобранных строк вы можете запросить какие-то столбцы, которые есть в таблицах, участвующих в выборке, заранее известные (в худшем случае все).
  2. Если вам нужно отбирать столбцы по какому-то критерию, значит у вас неверная структура данных.
  3. Судя по всему вы спутали базу данных (точнее таблицу) с экселем.
  4. Задача, которую вы решаете, вызвала трудности уже на ранней стадии, возможно стоило сначала задать вопрос о самой задаче, методах и путях ее решения, а потом решать местечковые проблемы.

Например, если вы хотите хранить матрицы, то для этого правильней использовать такую структуру:

create table matrix (row, col, value);

и содержать она будет понятное дело значения по соответствующим координатам:

...
insert into matrix values (2,1,0);
insert into matrix values (2,2,1);
insert into matrix values (2,3,0);
insert into matrix values (2,4,1);
insert into matrix values (2,5,1);
insert into matrix values (2,6,0);
...

Если вы хотите именовать строки и столбцы, это можно сделать в отдельных таблицах:

create table rows (id, name);
create table cols (id, name);

и наполнить их:

...
insert into rows values (2,'BIT');
...
insert into cols values (1,'A1');
insert into cols values (2,'A2');
insert into cols values (3,'A3');
insert into cols values (4,'A4');
insert into cols values (5,'A5');
insert into cols values (6,'A6');
...

Запрос для вашего курсора:

select cols.name
from matrix m
  join cols on m.col = cols.id
  join rows on m.row = rows.id
where
  m.value = 1 and rows.name='BIT';

В результате будет:

====
name
====
A2
A4
A5

ЗЫ Если имена строк и колонок можно вычислить, то можно их не хранить, а вычислять в запросе или в постобработке: в коде.

READ ALSO
Синглтон на основе DCL

Синглтон на основе DCL

Существует такая реализация синглтона на основе double checked locking (пункт 2):

323
Реализовать getMapAsync() в классе

Реализовать getMapAsync() в классе

Есть активити в которой реализую метод getMap(), но так как он depricated я его не могу реализовать в полной мереНашёл несколько вариантов решения...

393
Как отслеживать перемотку ListView

Как отслеживать перемотку ListView

Это мой класс наследованный от SimpleCursorAdapterЗаливаю базу данных в listview

491
Как не терять фокус?

Как не терять фокус?

Дело в том что у меня есть Видео Плеер использую библиотеку и перед ним ImageView, то есть типа баннера, которая закрывает 30% видеоплеераКаждые...

363