2013-06-26 1 views
0

Как я разместил здесь Need SQLite to replace only rows with new information, мне нужно получить информацию с веб-сервера и сравнить ее с тем, что у меня есть в моей базе данных SQLite. (Приложение для Android)Проверьте базу данных SQLite для повторяющихся записей, CursorLoader/Loader/AsyncTaskLoader? Confusion

У меня в настоящее время реализована реализация AsyncTask, которая дает мне HashMap. Я был в процессе кодирования базы данных SQLite, когда я столкнулся с Loaders.

Я смущен о том, как это сделать.

Должен ли я использовать CursorLoader или AsyncTaskLoader в этом случае? Я могу заменить текущий подкласс AsyncTask, который у меня есть сейчас?

private class getFleetList extends 
      AsyncTask<String, Integer, HashMap<String, ArrayList<Vehicle>>> { 

     @Override 
     protected HashMap<String, ArrayList<Vehicle>> doInBackground(
       String... params) { 
       //...implemented AsyncTask 
      } 

В настоящее время я предполагаю, что я заменю свою AsyncTask. Ссылка на учебник или что-то было бы очень полезно. Все обучающие программы, которые я нашел, используют широковещательные приемники или публикуют в ListViews, и это не то, что я делаю.

Благодаря

ответ

0

AsyncTask запускает код на не-UI (обычно называется "фон") нить. AsyncTask может делать что угодно, но он немного хрупкий, потому что он исчезает, если система перезапускает Activity, которая запустила AsyncTask. Это может произойти довольно легко, потому что система перезапускает текущую активность, если пользователь поворачивает устройство (если только вы не ловушки onSystemConfigurationChanged).

Формально AsyncTaskLoader является загрузчиком, который использует AsyncTask для запуска своего кода. Это означает, в реальности, что AsyncTaskLoader получает данные откуда-то, используя не-UI-поток (часть AsyncTask). Часть загрузчика просто дает вам удобные методы для обработки процесса получения данных, что может занять много времени. Часть загрузчика также позволяет отслеживать данные и перезагружать загрузку, если данные изменяются.

Основываясь на том, что вы сказали, ваша текущая реализация может использовать либо AsyncTask, либо AsyncTaskLoader. Если вам нужны функции Loader, выберите AsyncTaskLoader; в противном случае, придерживайтесь AsyncTask.

Вы не можете использовать CursorLoader. Хотя это не сразу очевидно, для создания CursorLoader необходим URI контента, что означает, что вам нужен поставщик контента. В вашей ситуации нет очевидного преимущества при использовании CursorLoader. CursorLoader добавляет материал поверх AsyncTaskLoader, например, встроенный ContentObserver, который автоматически запускает перезагрузку, когда изменяются данные для исходного URL-адреса содержимого CursorLoader.

В принципе, вы просто смотрите на определения классов класса, которые добавляют функциональность для более конкретных ситуаций.

Сказав все это, я вижу, что вы хотите, чтобы база данных веб-сервера и база данных устройства всегда были «синхронизированы». Верный?

Вы всегда можете указать, когда строка изменилась в поставщике контента, поскольку вы можете зарегистрировать ContentObserver для провайдера. Когда что-то в приложении пытается изменить данные, которые «наблюдаются», вы получаете обратный вызов. Система обнаруживает мутацию, сравнивая URI, переданный на вызов ContentResolver, в URI, который вы регистрируете для наблюдения. К сожалению, вы не можете сделать это для базы данных SQLite.

Если данные на веб-сервере изменяются, вы можете уведомить об этом устройство с помощью Google Cloud Messaging.

В обоих случаях вы можете создать адаптер синхронизации для обработки задач передачи и синхронизации данных и запускать его при изменении данных.

Сложная часть решает, как обращаться с конфликтами, но вы ищете обновления и дополнения (и удаления?).

+0

Интернет человек, так хорошо. Спасибо, что ответили, я думал, что это не даст ответа! Да, я уже испытал хрупкость (?) AsyncTask, когда вращаю свое устройство. Так почему я хочу использовать загрузчик? Android Dev: «Они отслеживают источник своих данных и приносят новые результаты при изменении контента». Я думаю, что это, вероятно, причина, по которой я хочу загрузчиков. Я мог бы просто обновлять всю базу данных SQLite каждый раз (около 1000 объектов), или я мог бы как-то обнаружить изменения (http://stackoverflow.com/a/17323515/2482818 У меня есть это предложение, но оно слишком негибкое?) – benzabill

+0

Также, что адаптер синхронизации? У меня уже реализован AsyncTask, означает ли это, что если я хочу AsyncTaskLoader, мне нужно всепроизвести все? Спасибо, тон, ваш ответ действительно помогает новому разработчику понять! – benzabill