【问题标题】:Inserting records via Loaders in android在android中通过Loaders插入记录
【发布时间】:2012-11-26 19:33:54
【问题描述】:

这个问题是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;
}

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

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

感谢您的宝贵时间。

【问题讨论】:

    标签: android sqlite insert android-loader


    【解决方案1】:

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

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

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

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

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

    你测试过onCreateLoader方法被调用了多少次吗?

    谁能告诉我一些正确的资源,它使用加载器来做 插入操作(我见过很多带有查询示例和 它就像一个魅力:) )

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

    【讨论】:

    • 您好,感谢您的回复.. 是的,我尝试使用普通游标加载器运行,但返回 null .. 它调用 onCreateLoader 两次..(我还注意到,如果我重新启动加载器,它会崩溃,因为我在上一次调用时返回 null)。我不想使用异步任务,因为它会对配置更改做出反应。感谢您将我指向 AsyncQueryHandler .. 那么理想情况下,游标加载器仅用于查询数据而没有其他 C-U-D 操作?
    • @Chris 那么理想情况下,游标加载器仅用于查询数据而没有其他 CUD 操作? 是的,仅使用 Loader 从提供者/数据库或您拥有的任何数据存储。如果我没记错的话,你不能从onCreateLoader 返回null,所以你的代码会失败。 LoaderManager 还负责处理 Loader 数据(例如 Cursor),以使其在配置更改或数据更新时保持有效状态,因此这些回调方法可以被调用更多次。
    • 谢谢,我假设由于 AsyncQueryHandler 是从 Handler 类扩展而来的,因此它不会像普通的 AysncTask 或 Thread 那样受到配置更改的影响。这只是使代码更难维护。但感谢您的回复。我将按照您的建议实施 AsyncQueryhandler。
    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多