【问题标题】:AsyncTask vs ContentProvider. What to use when accessing SQLite database?AsyncTask 与 ContentProvider。访问 SQLite 数据库时使用什么?
【发布时间】:2015-12-02 17:04:25
【问题描述】:

我的 Android 应用中有一个简单的数据库,其中包含有关国家/地区的信息。我必须做的一件事是用国家名称填充下拉菜单。

所以,我写了一些简单的代码,如下所示:

public class FetchCountryAsync extends AsyncTask<String,Void,Cursor> {
    private Context con;
    private CountryConsumer consumer;
    //----------------------------------------------------------------------------------------------
    public FetchCountryAsync(Context con, CountryConsumer consumer) {
        this.con = con;
        this.consumer = consumer;
    }
    //----------------------------------------------------------------------------------------------
    @Override
    protected Cursor doInBackground(String... params) {
        CountryDatabaseHelper helper = new CountryDatabaseHelper(con);
        Cursor countries = helper.getCountries();
        return countries;
    }
    //----------------------------------------------------------------------------------------------
    @Override
    public void onPostExecute(Cursor countries){
        if(!isCancelled()){
            consumer.setCountries( countries );
        }
    }
    //----------------------------------------------------------------------------------------------
}  

为了让它发挥作用,我做了很多废话——AsyncTaskinterface

我的问题是,写我自己的ContentProvider 并完全避免AsyncTask 的麻烦会更好吗?

【问题讨论】:

  • ContentProvider + LoaderCallbacksimo
  • @Blackbelt 一个简单的例子会很好,如果你不介意的话:) 我的意思是一个带有 LoaderCallbacks 的存根ContentProvider。不是全部。 :)
  • 喜欢这个one ?
  • @Blackbelt 绝对喜欢那个! :) 那么,决定何时使用 ContentProvider 以及何时使用 AsyncTask 的好方法是什么? :)
  • @Blackbelt 我正在努力保持代码尽可能干净。 AsyncTask + interface 的做法会导致大量的接口污染。另外,所有的回调都很难维护。

标签: android sqlite android-asynctask


【解决方案1】:

这取决于您以及您对应用的计划。

编写 ContentProvider 可能需要做更多的工作,但它会提供更全面、更灵活的数据访问点,您可以在应用程序中重复使用这些数据。例如,可通过 Uri 访问的查询、插入、更新、删除方法。

ContentProviders 允许您集中和抽象访问应用程序中的数据库/其他数据。这样,如果数据库结构发生变化,就有一个访问点需要更新以管理信息。根据我的经验,它只会让事情变得更干净。此外,如果您决定将信息分享给其他应用,ContentProvider 实现将使这一切变得容易。

如果它只是应用程序中单个活动的一次性信息检索任务,那么您所拥有的似乎还不错。如果您将在整个应用程序中使用它并在数据库中更新/插入数据或执行更复杂的查询,那么创建 ContentProvider 可能值得花费额外的时间/复杂性。

关于这个话题还有另一个很好的讨论here

【讨论】:

  • 啊,这个答案增加了清晰度。是的,目前这是一次性访问。如果数据在多个活动之间共享,那么ContentProvider 是要走的路,对吧? :)
  • 这不是一个硬性规定,但如果您需要多个 Activity 中的信息,这绝对是您应该考虑的事情。其他需要考虑的好标准是您是否需要在数据库中插入/更新/删除数据,以及您希望查询中是否存在任何类型的复杂变化。例如项目的子集而不是完整列表、单个项目、跨表查询结果等。
  • 我明白了。另外我想问一下如何使用 ContentProvider 将多值字段插入数据库。例如,如果 Web 服务以 JSON 形式返回用户的配置文件,并且该 JSON 包含一个数组,我希望使用 ContentProvider 将此配置文件保存到数据库中。 (虽然不是 JSON)
  • 当您构建 ContentProvider 时,您需要为 insert() 方法提供一个实现,该方法采用 ContentValues 对象(例如您要插入的值)。要使用它,您将为 ContentProvider 创建一个 uri,然后调用 ContentResolver 的 insert() 方法并传入 uri 和 content 值。操作系统将负责初始化 ContentProvider 并将参数传递给您实现的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多