Вставить данные в базу данных sqlite из фоновой службы

В моем приложении есть класс DBAdapter, который работает с базой данных 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();
    }
}

person nimteaj    schedule 28.09.2014    source источник
comment
так что не так с вашим нынешним подходом?   -  person rupps    schedule 28.09.2014
comment
В моем текущем подходе я не понимаю, как получить доступ или открыть и закрыть соединение с базой данных из службы. Я пробовал как в деятельности, но он показывает ошибки.   -  person nimteaj    schedule 28.09.2014
comment
Можете ли вы опубликовать конкретную трассировку стека ошибок? Теоретически нет ничего плохого в открытии/закрытии соединений с базой данных из службы.   -  person rupps    schedule 28.09.2014
comment
Теперь это исправлено. Спасибо всем. Я просто сделал обычный вызов базы данных из asynctask.   -  person nimteaj    schedule 29.09.2014


Ответы (1)


Вместо разбора массива JSON в PostExecute (String Result) проанализируйте данные в потоке doinBackground и сохраните детали в методе PostExecute.

Думаю, это может помочь тебе

person Abhishek Chaubey    schedule 28.09.2014
comment
Пожалуйста, добавьте код, или, возможно, это комментарий? - person The One and Only ChemistryBlob; 28.09.2014