2014-09-28 59 views
0

在我的应用程序中,我有一个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(); 
    } 
} 
+0

有啥错了你目前的做法” – rupps 2014-09-28 13:32:05

+0

在我目前的做法我不知道如何来访问或从服务打开和关闭数据库连接。我在活动中尝试,但它显示错误。 – Nabid 2014-09-28 13:49:03

+0

你可以发布特定的错误stacktrace?从理论上讲,打开/关闭服务的数据库连接没有任何问题 – rupps 2014-09-28 19:08:14

回答

1

,而不是分析上PostExecute(字符串结果)JSON阵列 解析数据上doinBackground线程并保存细节 上的PostExecute方法。

它认为它可以帮助ü

+0

请添加一些代码,或者这是一条评论? – 2014-09-28 14:00:47