Индекс столбца курсора меняется от телефона к телефону
-
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()
(вне цикла) безопаснее.