Autore Topic: Invio a Db remoto con Asynctask  (Letto 637 volte)

Offline formware

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • @Formware
    • Mostra profilo
  • Sistema operativo:
    Mac OS X
Invio a Db remoto con Asynctask
« il: 12 Luglio 2013, 15:11:52 CEST »
0
Salve a tutti,
premetto che sono nuovo nello sviluppo di applicazioni Android.
Sto sviluppando una app che memorizza in un db locale dei record; adesso vorrei che, una volta premuto un pulsante, la mia app leggesse tutto il contenuto del db e, per ogni record trovato, lo invii ad un db remoto (una sorta di sincronizzazione tra db locale e remoto)

Codice (Java): [Seleziona]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.app.ProgressDialog;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class Connessione extends Activity {

         SQLiteDatabase db;
         Cursor cursor;
         Button bConnessione, bBackup;
         TextView tDescrizione;
         String result=null;
         HttpClient client=null;
         HttpPost httpPost=null;
         ArrayList<NameValuePair> Records=null;
         ProgressDialog pd;
         
         
         private int NumeroRecord=0;
         
         public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
             setContentView(R.layout.ftp);             
             bConnessione = (Button)findViewById(R.id.Server);   
             bBackup=(Button)findViewById(R.id.backup);
             bConnessione.setOnClickListener(new Button.OnClickListener() {    
                 public void onClick(View v){
                         pd = ProgressDialog.show(Connessione.this,"Invio Dati","Connessione in corso...",true,false);
                         db=openOrCreateDatabase(Environment.getExternalStorageDirectory().getAbsolutePath() +Conf.PATHCompleto_SD_DATABASE   ,MODE_PRIVATE, null);
                                 cursor = db.query("TIPOLOGIA", null, null, null, null, null, null);
                                 int intRecord=cursor.getCount();
                                 cursor.moveToFirst();
                                 for (NumeroRecord=1; NumeroRecord<intRecord+1;NumeroRecord++) {                                         
                                         RecuperaRecord();
                                         HttpTask task = new HttpTask();
                                         task.execute(Records) ;                             
                             cursor.moveToNext();
                                }
                                db.close();
                                cursor.close();
                     }         
           
                 });
                 
             
       
         public  ArrayList<NameValuePair> RecuperaRecord(){
                 Records = new  ArrayList<NameValuePair>();
              Records.add(new BasicNameValuePair(cursor.getColumnName(0),cursor.getString(0)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(1),cursor.getString(1)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(2),cursor.getString(2)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(3),cursor.getString(3)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(4),cursor.getString(4)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(5),cursor.getString(5)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(6),cursor.getString(6)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(7),cursor.getString(7)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(8),cursor.getString(8)));
              Records.add(new BasicNameValuePair(cursor.getColumnName(9),cursor.getString(9)));
              return Records;
        }
       
       
        private class HttpTask extends AsyncTask<ArrayList<NameValuePair>,Void,String>  {
       
                  @Override
              protected String doInBackground(ArrayList<NameValuePair>... params) {
                 result = null;
                 try {
                   
                    // istanzio il client HTTP
                    client = new DefaultHttpClient();
                   
                    httpPost = new  HttpPost( "http://www.miosito.it/save.php");
                    httpPost.setEntity(new  UrlEncodedFormEntity(Records,"UTF-8"));        
                    client.execute(httpPost);
                    result="ok";

                 } catch (HttpResponseException e) {
                            Log.w("HTTP","HTTP Response Exception : "+e.toString());
                 } catch (Exception e) {
                    Log.w("HTTP","Error : "+e.toString());
                 } finally {
                    if (client != null) client.getConnectionManager().shutdown();
                 }      
                 return result;
              }
              @Override
              protected void onPostExecute(String result) {
                 // chiudo la progress dialog
                 
                  pd.dismiss();
            }
}
       
}

La cosa, per me strana, è che vengono recuperati prima tutti i record (naturalmente sovrascritti) e poi alla fine del ciclo for, viene richiamata la classe HttpTask.
Spero di essere stato chiaro.

Post unito: 12 Luglio 2013, 19:11:49 CEST
« Ultima modifica: 15 Luglio 2013, 11:57:49 CEST da formware, Reason: Merged DoublePost »

Offline formware

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • @Formware
    • Mostra profilo
  • Sistema operativo:
    Mac OS X
Re:Invio a Db remoto con Asynctask
« Risposta #1 il: 15 Luglio 2013, 11:57:23 CEST »
0
nessuno sa darmi un piccolo aiutino please!

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:Invio a Db remoto con Asynctask
« Risposta #2 il: 15 Luglio 2013, 12:13:26 CEST »
0
Codice (Java): [Seleziona]
task.execute(Records);
ma tu li stai passando tutto l'ArrayList, non il singolo elemento  :-P è questo lo fai tante volte quanti sono gli elementi nell'ArrayList
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Invio a Db remoto con Asynctask
« Risposta #3 il: 15 Luglio 2013, 12:14:03 CEST »
0
Non usare la variabile Records globale!
Istanziane una nuova ad ogni ciclo *localmente*.
Nessuno ti assicura che l'async venga fatto partire immediatamente, decide il sistema quando effettivamente mandalo in esecuzione in base a logiche interne sue; in questo caso specifico infatti ti parte alla fine del ciclo. Se lo fai lavorare su una variabile globale si ritroverà ad operare sempre e solo sugli ultimi dati.

Offline formware

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • @Formware
    • Mostra profilo
  • Sistema operativo:
    Mac OS X
Re:Invio a Db remoto con Asynctask
« Risposta #4 il: 15 Luglio 2013, 14:42:43 CEST »
0
Grazie per le risposte.
Pensavo che una volta che arrivasse sulla chiamata all'activesync partisse immediatamente per questo.

Ora modifico il codice e vi tengo informati.

Offline formware

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • @Formware
    • Mostra profilo
  • Sistema operativo:
    Mac OS X
Re:Invio a Db remoto con Asynctask
« Risposta #5 il: 22 Luglio 2013, 09:58:22 CEST »
0
Risolto tutto
Grazie
=)