Android, как запросить огромную базу данных в Android (размер курсора ограничен до 1 МБ)

Я работаю над созданием приложения, которое должно запрашивать в определенный момент времени, базы данных с более чем 4 тыс. Строк, и каждая строка имеет 90 полей (строк). Проблема в том, что если я выберу * из базы данных, мой курсор станет очень большим (более 4 МБ). И курсор в Android ограничен до 1 МБ. Как я могу решить это, или какой самый элегантный способ обойти это? Можно разбить базу данных на более мелкие порции и запросить их?

Спасибо аркде

Ответы на вопрос(3)

как правило, вы никогда не выбираете *. Для начала каждая строка будет иметь уникальный идентификатор, и ваш пользователь захочет выбрать только определенные строки и столбцы - то есть то, что они могут видеть на экране Android. Без грубости это довольно простой вопрос. Вы возвращаете только те столбцы и строки, которые вы хотите отобразить для этого экрана в телефоне - в противном случае вы расходуете бесполезное время автономной работы, не передавая данные. Стандартный подход заключается в использовании параметризованных хранимых процедур. Google параметризовал хранимые процедуры и немного читал - мимоходом - вы не можете обновить любую таблицу, пока вы не вернете уникальный идентификатор строки для этой таблицы.

 Aurelian Cotuna26 мар. 2012 г., 16:33
Я должен сделать выбор *, потому что, к сожалению, мне нужно использовать все поля. Пользователь будет редактировать некоторые поля, а другие будут использоваться для различных настроек.
 Ian P27 мар. 2012 г., 17:42
В этом случае у меня будет динамический SQL, где имена полей генерируются пользователем, выбирающим их из списка флажков, плюс любые скрытые поля, которые необходимо обновить, а затем переходят в подробный вид. Вы также можете сделать динамическое обновление оператора. Я до сих пор не знаю, как вы получаете все эти данные на типичном дисплее Android, хотя.
Решение Вопроса

кому это нужно.

   int limit = 0;
   while (limit + 100 < numberOfRows) {
       //Compose the statement
       String statement = "SELECT * FROM Table ORDER someField LIMIT '"+ limit+"', 100";
       //Execute the query
       Cursor cursor = myDataBase.rawQuery(statement, null);
       while (cursor.moveToNext()) {
           Product product = new Product();
           product.setAllValuesFromCursor(cursor);
           productsArrayList.add(product);
      }
      cursor.close();
      limit += 100;
 }

 //Compose the statement
 String statement = "SELECT * FROM Table ORDER someField LIMIT '"+  (numberOfRows - limit)+"', 100";
 //Execute the query
 Cursor cursor = myDataBase.rawQuery(statement, null);

 while (cursor.moveToNext()) {
     Product product = new Product();
     product.setAllValuesFromCursor(cursor);
     productsArrayList.add(product);
 }
 cursor.close();

Основная идея состоит в том, чтобы разделить ваши данные, чтобы вы могли использовать курсор так, как он должен использоваться. Он работает менее чем за 2 с для строк 5k, если у вас есть индексированная таблица.

Спасибо аркде

тям? Этот вопрос задавался несколько раз:Android SQLite и огромные наборы данных

Вот еще одно предложение: если у вас есть 90 полей, которые нужно изменить, разделите их на 10 разных видов. На каждом экране есть стрелка влево и стрелка вправо, чтобы вы могли перемещаться по горизонтали между экранами. Следовательно, каждый вид будет отображать 9 полей. Или какая-то такая стратегия. По сути, это все те же представления, за исключением имен столбцов, поэтому вам не нужно много менять код.

 Aurelian Cotuna26 мар. 2012 г., 16:35
Любая идея, как я могу сжать свои данные? Я использовал String для их хранения, так как размер строки увеличивается с увеличением количества символов в ней ... Я не знаю другого способа оптимизировать это.
 Sid26 мар. 2012 г., 16:32
Ограничение применяется ко всем данным, будь то из-за большого количества строк или действительно больших столбцов или множества столбцов. Я не знаю никакой альтернативы, кроме как как-то сжать ваши данные.
 Aurelian Cotuna26 мар. 2012 г., 16:28
Да, мне нужны все эти строки одновременно, так как они должны храниться в ArrayList для заполнения и адаптера для просмотра списка. И проблема, похоже, заключается в размере объектов, хранящихся в курсоре, а не в количестве строк (в ответе на предложенную ссылку есть проблема с количеством строк)
 Sid26 мар. 2012 г., 16:46
Вам нужно все 90 полей одновременно? Разве у вас нет разных взглядов? Вы используете CursorAdapter?

Ваш ответ на вопрос