[英]SQLiteException: error code 5: database is locked. When accessing ContentProvider from AsyncTask
[英]AsyncTask vs ContentProvider. What to use when accessing SQLite database?
我的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 );
}
}
//----------------------------------------------------------------------------------------------
}
我做了很多mumbo-jumbo讓它工作 - 一個AsyncTask
,一個interface
。
我的問題是,編寫我自己的ContentProvider
並避免麻煩的AsyncTask
是一種更好的方法嗎?
這取決於您以及您的應用程序的計划。
編寫ContentProvider可能會有更多工作,但它會為您可以在應用程序中重復使用的數據提供更加全面,靈活的訪問點。 例如查詢,插入,更新,刪除可通過Uri訪問的方法。
ContentProviders允許您集中和抽象訪問應用程序中的數據庫/其他數據。 這樣,如果db結構發生變化,就會有一個更新用於管理信息的訪問點。 它讓我的經歷變得更加清潔。 此外,如果您決定將信息共享給其他應用程序,ContentProvider實現將使這一切變得簡單。
如果它只是應用程序中單個活動的一次性信息檢索任務,你所擁有的似乎很好。 如果您將在整個應用程序中使用它並在數據庫中更新/插入數據或執行更復雜的查詢,那么制作ContentProvider可能需要額外的時間/復雜性。
還有與此相關的話題另一個很好的討論在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.