2010-11-02 3 views
1

Я работаю на строительство андроида приложения, но я ничего, что мои операции SQL принимает навсегда завершитьAndroid SQLite занимает много времени, чтобы закончить

Я профилированное приложение, чтобы сузить ее к акту перемещение курсора в первую строку результирующего набора для простого запроса выбора (только возврат 1 строки, где я тестирую его, чтобы устранить размер результирующего набора как проблему.

Есть ли лучшие варианты для перемещения до начала набора результатов?

Редакция:

некоторый код:

public Cursor sqlQuery(String Sql) 
{ 
    Cursor c = database.rawQuery(Sql, null); 
    //start at the first spot 
    c.moveToFirst(); 
    return c; 
} 

и вызывающий код

Cursor Slots = evedb.sqlQuery("SELECT attrib.value, " 
      +"attribtypes.attributename " 
      +"FROM dgmTypeAttribs AS attrib " 
      +"INNER JOIN invTypes AS type " 
      +"ON attrib.typeID = type._ID " 
      +"INNER JOIN dgmAttribs AS attribtypes " 
      +"ON attrib.attributeID = attribtypes._ID " 
      +"AND attribtypes.attributename = 'hiSlots' " 
      +"AND type.typeName = '" + shipname + "'"); 

это работает 3 раза и у меня есть время его приблизительно на 2 секунды для всего остального кода или через минуту с этим в .

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

+0

Не могли бы вы поделиться нами с кодом, который у вас есть, и посмотреть, не делаете ли вы что-то неправильно. Вы пытались запустить в консоли sqlite на adb запросы? – Pentium10

+0

см. Мой комментарий ниже. Я попробовал несколько вариантов перемещения указателя, но эта конкретная операция на вновь созданном курсоре выдувает мое время загрузки от примерно 2 секунд для 3-х запросов более чем за минуту. – Philderbeast

+0

добавлен код с более подробной информацией об уже выполненных тестах, чтобы найти источник моих проблем. – Philderbeast

ответ

0

У вас есть снипета кода, который вы используете в настоящее время, чтобы увидеть, что может быть неправильным?

Если вы говорите о переходе к первому элементу в курсоре, я использую: c.moveToFirst(), где c - это курсор.

+1

Я пробовал moveToFrist() moveToNext() и moveToPosition (0), но все это приводит к тому, что активность занимает 1 минуту, чтобы инициализировать всего 3 запроса – Philderbeast

1

Возможно, у вас есть большие массивы данных. Что вы можете сделать:

  1. Убедитесь в наличии соответствующих индексов КАЖДЫЙ поле, используемое в ON или WHERE синтаксис должен быть проиндексирован (все ваши поля FK индексируется вы задали PK на ваших полях _ID для каждой таблицы?) (вообще говоря).

  2. Вы должны немного изменить запрос:

    +"ON attrib.attributeID = attribtypes._ID " 
    +"WHERE attribtypes.attributename = 'hiSlots' " 
    +"AND type.typeName = '" + shipname + "'"); 
    
  3. Рассмотрите возможность использования PreparedStatement

  4. Проверить количество данных, используемых этим запросом - удалить, где состояние и просто поставить счетчик (*)

  5. Рассмотрите возможность разбиения одного большого запроса на несколько меньших. Существует также команда EXPLAIN, которая может использоваться для проверки пути, используемого SQLite для извлечения данных. Посмотрите here, чтобы получить дополнительную информацию.

Переход к первой строке - это точка, когда запрос начинает собирать данные, поэтому это просто проблема с производительностью базы данных.

Смежные вопросы