У меня и моей команды Android есть проблемы. У нас есть приложение, которое представляет контактную книгу пользователя с расширенной информацией.
Текущая настройка
Наше приложение читает Контакты поставщика ОС Android. Отправляет эту информацию на наш Сервер, который вычисляет для нас пару необходимых полей. Эта информация позже извлекается нашим приложением, и мы сохраняем эту информацию в базе данных SQLite. В нашей базе данных мы получаем две таблицы. Один со всеми числами и вся дополнительная информация, которую сервер рассчитывал для нас. Другая таблица - одна со всеми Контактами (один контакт может иметь несколько номеров). Эта таблица контактов создана только для производительности; мы можем выбрать курсор для выбора всех строк в этой таблице контактов в нашем CursorAdapter при представлении контактной книги для пользователя. Следовательно, при представлении контактной книжки пользователю, нам нужно только прочитать нашу собственную базу данных SQLite и только одну таблицу (например, нет JOIN).
Основная проблема
Происходит много синхронизации. Поскольку данные дублируются, нам нужно проверить наличие/изменение/удаление и синхронизировать все время. Более того, когда мы собираемся изменить конкретную вещь в нашем слое презентации, нам нужно изменить нашу таблицу контактов, чтобы включить эту конкретную информацию.
Приоритет для нас
1st: Производительность при представлении контактной книги пользователю.
2nd: поддержка кода.
Следовательно, не комментируйте: "Не дублируйте данные - это корень всех проблем". Для нас более важно то, что у пользователя нет проблем с производительностью, чем если бы мы, как разработчики, потратили дополнительное время на создание хороших алгоритмов синхронизации.
Решения?
Я не знаю почему, но я всегда думал, что CursorAdapter (чтение всех строк из одной таблицы) работает намного лучше, чем ArrayAdapter со списком объектов (хранящихся в памяти). Кто-нибудь знает, верно ли это? Поскольку одно решение, которое поможет нам, по крайней мере, половину пути, заключается в том, чтобы при запуске присоединиться к поставщику контактов (родной телефонной книге) и нашей расширенной информации, сохранить это в списке в памяти и представить его с помощью ArrayAdapter.
Создание собственных поставщиков контента? Я мало знаю о создании собственного поставщика контента. Кто-то пытался создать поставщика контента, который расширяет информацию родной контактной книги и присоединяется к ней. Возможно, с реализацией этого интерфейса: ContactsContract.DataColumnsWithJoins? Кто-нибудь пробовал что-нибудь подобное? Как производительность при представлении этой информации в CursorAdapter?
Пожалуйста, запросите дополнительную информацию, которую я, возможно, забыл, и я обновлю вопрос!
Большое спасибо за все полезные советы и решения!