Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask与ContentProvider。访问SQLite数据库时使用什么?_Android_Sqlite_Android Asynctask - Fatal编程技术网

Android AsyncTask与ContentProvider。访问SQLite数据库时使用什么?

Android AsyncTask与ContentProvider。访问SQLite数据库时使用什么?,android,sqlite,android-asynctask,Android,Sqlite,Android Asynctask,我的Android应用程序中有一个简单的数据库,其中包含有关国家的信息。我要做的一件事是在下拉菜单中填入国家的名称 所以,我写了一些简单的代码如下: public class FetchCountryAsync extends AsyncTask<String,Void,Cursor> { private Context con; private CountryConsumer consumer; //-----------------------------

我的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 );
        }
    }
    //----------------------------------------------------------------------------------------------
}  
公共类FetchCountryAsync扩展了AsyncTask{
私人语境;
私人消费者;
//----------------------------------------------------------------------------------------------
公共FetchCountryAsync(上下文con,CountryConsumer){
this.con=con;
这个。消费者=消费者;
}
//----------------------------------------------------------------------------------------------
@凌驾
受保护的游标doInBackground(字符串…参数){
CountryDatabaseHelper=新的CountryDatabaseHelper(con);
Cursor countries=helper.getCountries();
返回国;
}
//----------------------------------------------------------------------------------------------
@凌驾
PostExecute上的公共void(游标国家/地区){
如果(!isCancelled()){
消费国家(国家);
}
}
//----------------------------------------------------------------------------------------------
}  
为了让它正常工作,我做了很多复杂的事情——一个
异步任务
,一个
接口


我的问题是,编写自己的
ContentProvider
并完全避免
AsyncTask
的麻烦,这是否是一种更好的方法?

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

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

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

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


与此主题相关的还有另一个很好的讨论。

ContentProvider+LoaderCallbacks
imo@Blackbelt如果你不介意的话,举个简单的例子就好了:)我是说,一个带有LoaderCallbacks的存根
ContentProvider
。不是全部。:)像这样吗?@Blackbelt肯定像那样!:)那么,什么是决定何时使用
ContentProvider
以及何时使用
AsyncTask
@Blackbelt我正在努力保持代码尽可能干净<代码>异步任务+
接口
方法导致大量接口污染。另外,所有的回调都使维护变得困难。啊,这个答案增加了清晰度。是的,目前是一次性的。如果数据是跨多个活动共享的,那么
ContentProvider
就是一种方法,对吗?:)这不是一个硬性的规则,但如果你需要一个以上的活动中的信息,这绝对是你应该考虑的。要考虑的其他好的标准是,是否需要插入/更新/删除数据库中的数据,以及在查询中是否存在任何期望的复杂变化。例如,项目的子集而不是完整列表、单个项目、跨表查询结果等。我还想问一下如何使用ContentProvider将多值字段插入数据库。例如,如果一个Web服务返回一个作为JSON的用户配置文件,并且该JSON包含一个数组,我希望使用ContentProvider将该配置文件持久化到数据库中。(但不是JSON)在构建ContentProvider时,需要为接受ContentValues对象(例如要插入的值)的insert()方法提供一个实现。要使用它,您将为ContentProvider创建一个uri,然后调用ContentResolver的insert()方法并传入uri和内容值。操作系统将负责初始化ContentProvider并将参数传递给您实现的方法。