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

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

Спасибо, Arkde

Ответы [ 3 ]

9 голосов
/ 27 марта 2012

Я нашел способ справиться с этим и хочу поделиться со всеми, кому это нужно.

   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 с для строк по 5 тыс.

Спасибо, Arkde

1 голос
/ 26 марта 2012

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

1 голос
/ 26 марта 2012

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

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

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