Android AsyncTask与ContentProvider。访问SQLite数据库时使用什么?
我的Android应用程序中有一个简单的数据库,其中包含有关国家的信息。我要做的一件事是在下拉菜单中填入国家的名称 所以,我写了一些简单的代码如下: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; //-----------------------------
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并将参数传递给您实现的方法。