从后台服务插入数据到sqlite数据库
问题描述:
在我的应用程序中,我有一个DBAdapter类处理SQLite数据库。我想开始一个后台服务,从Web获取一些数据,并写入数据库。该服务是异步的。从后台服务插入数据到sqlite数据库
请给出一个提示或一些参考如何使用后台服务和我的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();
}
}
答
,而不是分析上PostExecute(字符串结果)JSON阵列 解析数据上doinBackground线程并保存细节 上的PostExecute方法。
它认为它可以帮助ü
+0
请添加一些代码,或者这是一条评论? – 2014-09-28 14:00:47
有啥错了你目前的做法” – rupps 2014-09-28 13:32:05
在我目前的做法我不知道如何来访问或从服务打开和关闭数据库连接。我在活动中尝试,但它显示错误。 – Nabid 2014-09-28 13:49:03
你可以发布特定的错误stacktrace?从理论上讲,打开/关闭服务的数据库连接没有任何问题 – rupps 2014-09-28 19:08:14