Индекс столбца курсора меняется от телефона к телефону

StackOverflow https://stackoverflow.com//questions/24000319

  •  20-12-2019
  •  | 
  •  

Вопрос

Мое приложение позволяет пользователю звонить на самый последний набранный номер.Нажав кнопку «Вызов» с пустым текстовым полем, вы получите последний исходящий номер в моей базе данных ORM.Однако проблема возникает только на некоторых телефонах.

Когда я извлекаю свои данные, я делаю это с помощью следующего кода:

Dao<RecentCallsInfo, Integer> dao = null;
if (getActivity() instanceof MainActivity) {
    MainActivity main = (MainActivity) getActivity();
    dao = main.getDatabaseHelper().getRecentDataDao();
}

QueryBuilder<RecentCallsInfo, Integer> qb = dao.queryBuilder();
qb.orderBy(RecentCallsInfo.RECENT_COLUMN_ID, false);
qb.where().eq(RecentCallsInfo.RECENT_COLUMN_CALL_TYPE, "Outgoing");

// when you are done, prepare your query and build an iterator
CloseableIterator<RecentCallsInfo> iterator = dao.iterator(qb.prepare());

// get the raw results which can be cast under Android
AndroidDatabaseResults results = (AndroidDatabaseResults)iterator.getRawResults();
Cursor c = results.getRawCursor();

if(c.moveToFirst()){
    if(!c.getString(RecentQuery.COLUMN_NUM).isEmpty()){
        System.out.println("Recent Record: \n Name:" + c.getString(RecentQuery.COLUMN_NAME) + 
        "\nNum:" + c.getString(RecentQuery.COLUMN_NUM) + "\nNumType:" + c.getString(RecentQuery.COLUMN_NUM_TYPE)+ 
        "\nCallType:" + c.getString(RecentQuery.COLUMN_CALL_TYPE));

        etcalle.setText(c.getString(RecentQuery.COLUMN_NUM));
     }
 }

 //RecentQuery.COLUMN_NAME = 5
 //RecentQuery.COLUMN_NUM = 6
 //RecentQuery.COLUMN_NUM_TYPE = 0
 //RecentQuery.COLUMN_CALL_TYPE = 2

Когда я отлаживаю свой c Курсор, он дает мне эти столбцы с этими значениями

[recentNumberType, recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, _id]

Name:anthony
Num:(111) 111-1111
NumType:Mobile
CallType:Outgoing

Когда я получу свой c Курсор на другом телефоне я получаю

[recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, recentNumberType, _id]

Name:(111) 111-1111
Num:Mobile
NumType:FREE
CallType:1867

Поэтому, когда я пытаюсь получить данные по индексу, я получаю разные значения.Почему это происходит?Оба телефона Nexus 5 и на 4.4.2.

Любое понимание этого вопроса было бы здорово.Спасибо!

Это было полезно?

Решение

Столбцы могут «меняться».Например, рассмотрим этот случай.

  • Версия 1 приложения создает таблицу T со столбцами. A, C
  • В версии 2 вы хотите изменить структуру базы данных.Итак, вы добавляете B столбец в ваши сценарии «создать таблицу».В новых устройствах в этой таблице будут столбцы A, B, C.
  • Однако в части onUpgrade() вы просто добавляете столбец B (с помощью ALTER TABLE), и структура в конечном итоге будет иметь вид A, C, B.

В общем, использовать фиксированные («целочисленные») индексы столбцов — плохая идея, если вы также не укажете, какие столбцы вам нужны (т. е.не используется SELECT *).С использованием getColumnIndex() (вне цикла) безопаснее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top