2

这个问题将是Content Resolver vs Cursor Loader的后续问题, 其中答案清楚地说明了如何使用 Content Resolver 将记录插入到 sqlite Db 中。我的问题如下:

  1. 我可以使用加载器(普通加载器)来实现这个功能吗?

例如:

    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
            switch (id) {

    case AppConstants.LOADER_ADD_FAV_PHONE_NUM:

        ContentValues values = new ContentValues();
        values.put(DBHelper.TM_DB_COLUMN_PHONE_NUMBER,
                directionOrder);
        values.put(TransitMeDBHelper.TM_DB_COLUMN_NAME_ID, selectionArgs[0]);
        Uri insertFavStop =getContentResolver().insert(TransitMeContentProvider.CONTENT_URI_INSERT_FAV_PHONE,
                        values);
        break;
    }

return null;
}

这会在 Main UI 线程还是工作线程中运行功能。我知道我不会收到回调,因为内容解析器将返回一个 URI 而不是包含数据的游标。

我尝试运行此代码,但它的行为有点奇怪.. 重复插入被记录并且它不一致,有人可以向我展示一些使用加载器进行插入操作的正确资源(我已经看到了许多带有查询示例的示例并且它有效像一个魅力:))

感谢您的时间 。

4

1 回答 1

5

我可以使用加载器(普通加载器)来实现这个功能吗?

您不能使用默认值CursorLoader来插入数据。如果您实现自己的方法,Loader您可能可以使用loadInBackground方法进行插入,但这最多会使您的代码变得笨拙(而且我不知道它是否真的有效)。

这会在 Main UI 线程还是工作线程中运行功能。我知道我不会收到回调,因为内容解析器将返回一个 URI 而不是包含数据的游标。

加载器回调将在实现它们的线程上运行(最有可能是 UI 主线程),因此您在getContentResolver().insert()主 UI 线程上执行此操作可能会阻塞主 UI 线程。

我尝试运行此代码,但它的行为有点奇怪.. 重复插入被记录并且它不一致,

onCreateLoader您是否测试过该方法被调用了多少次?

有人可以向我展示一些使用加载器进行插入操作的正确资源(我已经看到了许多带有查询示例的示例,它的工作原理就像一个魅力:))

不要使用/尝试使用 aLoaderContentProvider/Database 中插入数据。它就像查询的魅力一样,因为加载器旨在从数据源加载数据(而不是插入数据),这就是它们的目的。如果要插入数据,请使用常规线程AsyncTask(也可以查看)。AsyncQueryhandler

于 2012-11-26T20:13:20.720 回答