在我的应用程序中,我有一个处理SQLite数据库的DBAdapter类。我想启动后台服务,从Web获取一些数据,然后写入数据库。该服务是异步的。
请提供一些提示或一些参考,说明如何使用后台服务和我的DBAdapter类异步地将数据写入我的数据库。提前谢谢。
DBAdapter.java
public class DBAdapter {
// define tag
public static final String TAG = "DBAdapter";
// define table fields
static final String KEY_ID = "_id";
static final String KEY_NAME = "name";
// define table names
static final String TABLE_INFO = "info";
// define database name
static final String DATABASE_NAME = "test_db_debug";
// define database version
static final int DATABASE_VERSION = 1;
// define separators
static final String COMMA_SEP = ", ";
static final String IPA_SEP = " integer primary key autoincrement ";
static final String INT_SEP = " integer";
static final String TEXT_SEP = " TEXT";
// define database creation queries
static final String CREATE_INFO = "create table " + TABLE_INFO + "( "
+ KEY_ID + IPA_SEP + COMMA_SEP
+ KEY_NAME + TEXT_SEP +" )";
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
// Constructor. Creates database.
public DBAdapter( Context ctx ) {
this.context = ctx;
// create database
DBHelper = new DatabaseHelper(context);
}
// ----- make private class -----
private class DatabaseHelper extends SQLiteOpenHelper {
// constructor
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
//Toast.makeText(context, "DatabaseHelper Constructor", Toast.LENGTH_LONG).show();
Log.d(TAG, "DatabseHelper Constructor Loaded.");
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// create databases
try {
db.execSQL(CREATE_INFO);
Log.d(TAG, "All tables has been created.");
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.d( TAG, "Updating database from version " + oldVersion + " to " + newVersion +
", which will destroy all old data.");
String drp = "DROP TABLE IF EXISTS ";
db.execSQL( drp + TABLE_INFO );
onCreate(db);
}
} // ----- ends private class ------
// --- opens the database ---
public DBAdapter open() {
db = DBHelper.getWritableDatabase();
Log.d(TAG, "Database opened.");
return this;
}
// --- closes the database ---
public void close() {
DBHelper.close();
Log.d(TAG, "Database closed.");
}
// get all data of table
public Cursor getAllData() {
return db.query(TABLE_INFO, new String[]{ KEY_ID, KEY_NAME }, null, null, null, null, null);
}
// insert data
public long insertData( int id, String name ) {
ContentValues cv = new ContentValues();
cv.put(KEY_ID, id);
cv.put(KEY_NAME, name);
return db.insert(TABLE_INFO, null, cv);
}
}
后台服务:
public class DownloadAllData extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub""
Log.d("DB", "Service Started");
Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_LONG)
.show();
new DoBackgroundTask()
.execute(new String[] {
"http://192.168.2.7/orca_android_app/select_country.php?key=country",
"country","id", "name" });
stopSelf();
// return super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
private class DoBackgroundTask extends AsyncTask<String, Void, String> {
String [] KEY;
@Override
protected String doInBackground(String... urls) {
// TODO Auto-generated method stub
KEY = urls;
Log.d("DB", urls[0]);
Log.d("DB", "length of urls: "+urls.length);
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
JSONParser jParser = new JSONParser();
JSONObject json = jParser.makeHttpRequest(urls[0], "GET", params);
return json.toString();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
try {
JSONObject jObject = new JSONObject(result);
JSONArray jsonArray = jObject.getJSONArray("result");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.d("DB", "in for: "+jsonObject.toString());
ContentValues cv = new ContentValues();
for( int j=2; j<KEY.length; j++ ) {
String str = jsonObject.getString( KEY[j] );
cv.put( KEY[j], str );
Log.d("DB", KEY[j]+": "+str);
}
}
} catch (Exception e) {
e.printStackTrace();
Log.e("DB", "onPostExecute Error: " + e.getMessage());
}
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.d("DB", "Service Destroyed");
super.onDestroy();
}
}
答案 0 :(得分:1)
而不是在PostExecute上解析JSON数组(字符串结果) 解析doinBackground线程上的数据并保存详细信息 在PostExecute方法上。
它认为它可能有助于你