检查SQLite数据库是否有重复的条目,CursorLoader / Loader / AsyncTaskLoader?混乱

时间:2013-06-26 20:48:28

标签: android sqlite

当我在这里发布Need SQLite to replace only rows with new information时,我需要从网络服务器获取信息,并将其与我在SQLite数据库中的信息进行比较。 (Android App)

我目前有一个AsyncTask实现,它给了我一个HashMap。 当我遇到装载机时,我正在编写SQLite数据库。

我对如何做到这一点很困惑。

在这种情况下,我想使用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,这不是我正在做的事情。

由于

1 个答案:

答案 0 :(得分:0)

AsyncTask在非UI(通常称为“后台”)线程上运行代码。 AsyncTask可以做任何事情,但它有点脆弱,因为如果系统重新启动启动AsyncTask的Activity,它就会消失。这很容易发生,因为如果用户旋转设备,系统会重新启动当前的Activity(除非你捕获onSystemConfigurationChanged)。

形式上,AsyncTaskLoader是一个使用AsyncTask来运行其代码的Loader。这实际上意味着AsyncTaskLoader通过使用非UI线程(AsyncTask部分)从某处获取数据。加载器部分为您提供了处理数据获取过程的便捷方法,这可能需要很长时间。加载程序部分还允许您跟踪数据并在数据更改时重新启动加载。

根据您所说的,您当前的实现可以使用AsyncTask或AsyncTaskLoader。如果需要Loader的功能,请选择AsyncTaskLoader;否则,坚持使用AsyncTask。

您无法使用CursorLoader。虽然它不是很明显,但您需要一个内容URI来创建CursorLoader,这意味着您需要一个内容提供者。在您的情况下,使用CursorLoader没有明显的优势。 CursorLoader在AsyncTaskLoader之上添加内容,例如内置的ContentObserver,当原始CursorLoader查询的内容URI的数据发生变化时,它会自动触发重新加载。

基本上,您只是在查看为更多特定情况添加功能的类定义层。

说完这一切后,我发现你想确保网络服务器的数据库和设备的数据库始终“同步”。正确?

您可以随时告知内容提供程序中的行已更改,因为您可以为提供程序注册ContentObserver。当应用程序中的某些内容试图改变“观察”的数据时,您会收到回调。系统通过将传递给ContentResolver调用的URI与您注册要观察的URI进行比较来检测突变。不幸的是,你无法为SQLite数据库执行此操作。

如果网络服务器上的数据发生变化,您可以使用Google Cloud Messaging通知设备。

在这两种情况下,您都可以创建同步适配器来处理数据传输和同步任务,并在数据更改时运行它。

棘手的部分是决定如何处理冲突,但你只是在寻找更新和添加(和删除?)。