Autore Topic: parsing di un intero recordset da una activity all'altra  (Letto 1495 volte)

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
parsing di un intero recordset da una activity all'altra
« il: 23 Giugno 2013, 09:12:39 CEST »
0
Buon giorno,

Desidero parsare un intero Recordset da una Activity all'altra.

La prima activity si occupa tra altre cose di consultare un archivio remoto su MySQL, una volta compilato il Recordset desidero "passarlo"
alla Activity che si occuperà di "tabellare" i dati.

Ho usato il seguente codice:
Codice: [Seleziona]
          Intent intentC5_5 = new Intent(getBaseContext(), TabellaEsternaActivity.class);
          intentC5_5.putExtra("Estratto", rs2);
          startActivity(intentC5_5);//Andata verso TabellaEsternaActivity.
          finish();

è chiaro che rs2 contiene:
Codice: [Seleziona]
ResultSet rs2 = (ResultSet) stmt2.executeQuery("SELECT * FROM " + "personale");

ma, mi viene segnalato che:
The method putExtra(String, boolean) in the type Intent is not applicable for the arguments (String, ResultSet)

La mia domanda è: come passare un intero Recorset ? quale istruzione usare allo scopo? putExtra sembra non essere adeguata....

Grazie
Saluti
Ceklo
« Ultima modifica: 23 Giugno 2013, 09:17:21 CEST da ceklo »

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:parsing di un intero recordset da una activity all'altra
« Risposta #1 il: 24 Giugno 2013, 14:55:11 CEST »
0
Penso la soluzione migliore sia salvarlo in un db locale e poi leggere il db dall'activity successiva

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all'altra
« Risposta #2 il: 24 Giugno 2013, 16:38:44 CEST »
0
Spero vivamente che ci sia una soluzione migliore
Intaserei la memoria,  dopo ad ogni aggiornamento dovrei eliminare il db precedente.......
Non mi convince, se poi non c'è altro modo.....  :-(
Ceklo

Offline jfabrix101

  • Nuovo arrivato
  • *
  • Post: 10
  • jfabrix101 - Android Developer
  • Respect: +2
    • jfabrix101
    • Mostra profilo
    • Fabrizio Russo
  • Dispositivo Android:
    Galaxy Nexus - Asus Transformer Prime
  • Play Store ID:
    frusso
  • Sistema operativo:
    Ubuntu
Re:parsing di un intero recordset da una activity all'altra
« Risposta #3 il: 24 Giugno 2013, 20:42:59 CEST »
0
Crea un oggetto serializzabile nel quale puoi inserire i dati della riga che ti interessa ( o un array list se vuoi più record) e passa questo oggetto alla tua activity.

Il tuo oggetto rapper deve essere serializabile ( implements java.io.Serializable)

Inviato dal mio Nexus 7 con Tapatalk 2

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all\'altra
« Risposta #4 il: 24 Giugno 2013, 20:47:45 CEST »
0
Grazie jfabrix101

Scusa la mia ignoranza, non ci capisco molto ma sono pronto a fare una ricerca. Devo studiare l'argomento da zero.
Non sò come implementarlo, mi daresti qualche dettaglio in più ?

Grazie
Ceklo

Post unito: 25 Giugno 2013, 21:06:16 CEST
Non ci capisco molto......
Per favore ditemi se sto andando giusto ?
Android – Parcel data to pass between Activities using Parcelable classes | words on sand

Serializable......Parcelable....Help !     o_O
Ceklo
« Ultima modifica: 25 Giugno 2013, 21:14:51 CEST da ceklo »

Offline jfabrix101

  • Nuovo arrivato
  • *
  • Post: 10
  • jfabrix101 - Android Developer
  • Respect: +2
    • jfabrix101
    • Mostra profilo
    • Fabrizio Russo
  • Dispositivo Android:
    Galaxy Nexus - Asus Transformer Prime
  • Play Store ID:
    frusso
  • Sistema operativo:
    Ubuntu
Re:parsing di un intero recordset da una activity all'altra
« Risposta #5 il: 27 Giugno 2013, 21:08:48 CEST »
0
Serializable è un concetto java e di conseguenza te libri trovi anche in android
Parcelable è un concetto solo android

Entrambi servono a rendere persistente un oggetto (cioè di salvare e ripristinare il proprio stato). Percelable è più performante ma più complesso se parti da zero, quindi ti consiglio di usare serializable

Sent from my ZP950+ using Tapatalk 2


Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all\'altra
« Risposta #6 il: 03 Agosto 2013, 16:31:03 CEST »
0
Sono al lavoro con l'argomento parcelable,

Ho trovato utile questo riferimento: android - Example of Implementing Parcelable - Stack Overflow
NOTA: qui non trascrivo la classe "Student" che è rimasta inalterata, prelevandola direttamente dall'esempio .

Ho fatto dei test e tutto funziona bene, riesco a passare 3 stringhe (uso gli stessi parametri dell'esempio).

Codice: [Seleziona]
//invio:
intent.putExtra("student", new Student("1","Mike","6"));

//ricezione:
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");

Infine, per recuperare le 3 stringhe uso il metodo get... e sono di nuovo disponibili i valori: "1", "Mike", e "6".  ;-)

Ora, lo scopo è trasferire un intero ResultSet recuperato precedentemente dalla interrogazione ad un server esterno via WiFi.
Come strategia "furba" desidero sostituire una delle stringhe dell'esempio di prima con il mio benedetto ResultSet, ma non ci riesco. Devo prima convertirlo ? In cosa ?
Tra le cose lette sul sito menzionato qui sopra, trovo scritto:
"This example shows only String types. But, you can parcel any kind of data you want. Try it out." Molto promettente....

Ho letto anche: Snapshots of my experiments...: Android Parcelable Example
mi riferisco in particolar modo a:

Codice: [Seleziona]
public void writeToParcel(Parcel dest, int flags) {
      dest.writeInt(id);
      dest.writeString(name);
      dest.writeString(desc);
      dest.writeStringArray(cities);

non esiste un dest.writeResultSet(...
tantomeno un source.readResultSet(...     vedi qui sotto:

Codice: [Seleziona]
      public ParcelData(Parcel source){
            id = source.readInt();
            name = source.readString();
            desc = source.readString();
            source.readStringArray(cities);

Chiedo se è possibile a trasferire in blocco un ResultSet ?

Grazie
Saluti
ceklo

Post unito: 05 Agosto 2013, 09:06:50 CEST

Sono arrivato a questo punto:

Codice: [Seleziona]
import java.io.Serializable;
import java.sql.ResultSet;
import android.os.Parcel;
import android.os.Parcelable;

public class ParcelManager implements Parcelable {
    protected Integer numDiRighe;
    protected ResultSet resultSet;
   
    public ParcelManager(Parcel in) {
            readFromParcel(in);
    }
 
    //Constructor.
    public ParcelManager(int n_of_rows, ResultSet rSet) {
        this.numDiRighe = n_of_rows;
        this.resultSet = rSet;
        }
   
    //Getter methods.
    public Integer getRighe() {
        return numDiRighe;
    }
   
    public ResultSet getRS() {
        return resultSet;
    }
   
        //Setter methods.
        public void setIntValue(int n_of_rows) {
                this.numDiRighe = n_of_rows;
        }

        public void setSerializableValue(ResultSet rSet) {
                this.resultSet = rSet;
        }
       
    public int describeContents() {
        return 0;
    }
   
        public void writeToParcel(Parcel out, int flags) {
        out.writeInt(numDiRighe);
        out.writeSerializable((Serializable) resultSet);
    } 
 
    private void readFromParcel(Parcel in) {     
        numDiRighe = in.readInt();
        resultSet = (ResultSet) in.readSerializable();
    }
 
    public static final Parcelable.Creator<ParcelManager> CREATOR = new Parcelable.Creator<ParcelManager>() { 
   
        public ParcelManager createFromParcel(Parcel in) {
            return new ParcelManager(in);
        }

        public ParcelManager[] newArray(int size) {
            return new ParcelManager[size];
        }
    };

}

Mentre continuavo la mia ricerca, ho consultato: Logic Exception: A Parcelable Tutorial for Android

In particolare, ho trovato interessante:

Codice: [Seleziona]
out.writeSerializable(createdAt);  e
createdAt = (Date) in.readSerializable();

Facendo cast su ResultSet credo che funzioni...
Per ora riesco soltanto a "passare" un ResultSet <null>.
Non so ancora se funziona con un ResultSet ricavato dalla consultazione del server esterno via WiFi (devo ancora provare).

Grazie
Saluti
ceklo
« Ultima modifica: 05 Agosto 2013, 17:07:39 CEST da ceklo »

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all'altra
« Risposta #7 il: 06 Agosto 2013, 15:24:11 CEST »
0
Tutto funziona se "passo" un ResultSet <null> se invece "passo" un ResultSet con 6 righe e 20 colonne (tutto sommato piccolo) ottengo il seguente errore:

Exception: com.mysql.jdbc.ResultSet cosa vuole dire ?

Grazie
Saluti
ceklo

Offline jfabrix101

  • Nuovo arrivato
  • *
  • Post: 10
  • jfabrix101 - Android Developer
  • Respect: +2
    • jfabrix101
    • Mostra profilo
    • Fabrizio Russo
  • Dispositivo Android:
    Galaxy Nexus - Asus Transformer Prime
  • Play Store ID:
    frusso
  • Sistema operativo:
    Ubuntu
Re:parsing di un intero recordset da una activity all'altra
« Risposta #8 il: 07 Agosto 2013, 16:07:33 CEST »
0
E' piuù fcile di quanto credi

Supponiamo che la tua query tiri fuori 5 colonne (il numero di righe non importa)
Quello che bisogna fare è creare una lista di oggetti estratti. Questa lista sarà poi passata alla ListView in modo da popolare la lista.

Quindi:
Crea una classe che rappresenti l'entità del record estratto. Supponendo che la tua query tiri fuori un resultSet con tre colonne (cognome, nome, telefono) puoi creare un oggetto del tipo

Codice (Java): [Seleziona]
// Oggetto che wrappa il record
public class MyWrapperBean implements java.io.Serializable {
   private String cognome;
   private Stirng nome;
   private Stirng telefono;
}

// Oggetto che wrappa il resultSet
public class MyWrapperList implements Serializable {
               
   List<MyWrapperBean> list = new ArrayList<MyWrapperBean>();

}

poi aggiungi costruttori e getter e setter a piacere

Successivamente bisgona traferire il resultSet in una lista da passare poi alla seconda actvity:
scorri il resultSet e per ogni record creato aggiungi un elemento di MyResultSetWrapper alla lista

Codice (Java): [Seleziona]
List<MyWrapperBean> myList = new ArrayList<MyWrapperBean>();
while (resultSet.next()) {
   MyWrapperBean item = new MyWrapperBean();
   item.setCognome(rs.getString(1));
   // ... ecc ecc - popola l'oggetto item con tutti gli elementi del resultSet
}
rs.close(); ... ecc ecc

// Questo è l'oggetto che sarà passato alla seconda activity
MyWrapperBean lista = new MyWrapperBean();
lista.setList(lista);

A posto ora puoi passare la lista alla tua activity


Codice (Java): [Seleziona]
Intent intent = new Intent(context, TuaSecondaActivity.class);
intent.getExtras().putSerializable("riferimento", lista);
startActivity(intent);


Ovviamente dall'activity dovrai riprenderti l'oggetto con

Codice (Java): [Seleziona]
getIntent().getExtras().getSerializable("rigerimento")
e castarlo all'oggetto MyWrapperBean

Non sono sicuro che tutto sia corretto perchè non ho un eclipse a portata di mano, ma bene o male dovrebbe andare.

NON E' LA SOLUZIONE MIGLIORE

Se hai già wrappato gli oggetti con i parceable allora puoi usare anche il metodo

Codice (Java): [Seleziona]
getIntent().getExtras().putParcelable
che ottimizza meglio.

Rimane da capire il motivo reale per cui non fai la query direttamente nella seconda activity magari passandoti dalla prima solo i parametri per farla !!!

ciao

Offline aw4y

  • Utente junior
  • **
  • Post: 59
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    samsung i5500
  • Sistema operativo:
    osx/linux
Re:parsing di un intero recordset da una activity all'altra
« Risposta #9 il: 07 Agosto 2013, 16:42:18 CEST »
0
personalmente trovo molto scomodo parcelable e dintorni: siccome generalmente nel mio progetto c'e' sempre una libreria per xml o json (gson e' la mia preferita) se devo passare oggetti complessi (tipo array di POJOs), preferisco serializzarli in json e poi passarli con intent extras come chiave/valore.

aw4y

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all'altra
« Risposta #10 il: 07 Agosto 2013, 17:50:10 CEST »
0
Grazie jfrabrix101 della risposta, ero completamente fuori strada dato che l'argomento mi è nuovo, forse molto complesso per le mie capacità, pero sono convinto che se non affronto non imparo  ???

Rispondo all'ultima domanda che è il motivo di tutto questo, la mia activity fa molte cose in realtà:
1) recupera dati in automatico in arrivo da altre fonti come NFC,
2) aggiunge questi ed altri dati ad esempio, la data di esecuzione di un determinato controllo, catturando direttamente il valore dal sistema per evitare manomissioni. Tutto questo viene archiviato temporaneamente in un database interno SQLite. In questo modo i dati vengono conservarli in "pancia" fino alla fine della giornata.
3) finita la giornata di lavoro l'operatore integra a mano con altri dati (con note, dati, speciali, ecc. ecc).
4) quando è sicuro invia al server esterno i dati per acodarli in un database MySQL (naturalmente il database interno viene svuotato).
5) infine (e come ultima attività) per "vedere" se tutto è andato a buon fine, interroga per esteso TUTTO il database esterno applicando dei filtri (querry elaborata). Una volta ottenuto quest'ultimo ResultSet desidero "passarlo" alla seconda Activity che non fa altro che mostarlo in una tabella.

Ecco la domanda, perchè non passare soltanto i parametri alla seconta activity ?

Le ragioni sono due:
1) l'Activity 1 è molto ordinata, pulita e collaudata, e contiene tutte le operazioni indicate sopra, non voglio smembrarla "sparpagliando" interrogazioni a database "quà e là".
2) Mi capita che il tempo necessario a compilare il ResultSet è molto superiore al tempo per disegnare una tabella.
Se interogo il database esterno sulla seconda activity ho due thread, uno che interroga appunto il server tramite WiFi con le sue lentezze e l'altro thread che disegna programmaticamente la tabella dove rappresentare i dati. Quest'ultima operazione finisce prima che siano disponibili i dati. e tutto va in crash. (NOTA: non sono pratico sul come governare thread, non so come assicurare la fine del primo se ha precedenza sul secondo)

Se invece "passo" il ResultSet, questo è già completo al momento dell'intent quindi, la seconda activity disegna e basta.
(NOTA: non ho calcolato il tempo per estrarre i dati dal ResultSet una volta arrivati sulla seconda activity, spero che non sia così lento come interrogare via WiFi)

Ora passo ai ringraziamenti, domani riprenderò il lavoro cercando di applicare le nozioni ricevute. Se mi serve ulteriore aiuto chiederò nuovamente sperando di non disturbare troppo.

M'incuriosisce anche la risposta di aw4y, non ci ho capito molto ma ringrazio lo stesso, sarà un argomento da leggere più avanti.
Per un principiante come me meglio un boccone alla volta :-P

Saluti
ceklo
« Ultima modifica: 07 Agosto 2013, 18:13:52 CEST da ceklo »

Offline jfabrix101

  • Nuovo arrivato
  • *
  • Post: 10
  • jfabrix101 - Android Developer
  • Respect: +2
    • jfabrix101
    • Mostra profilo
    • Fabrizio Russo
  • Dispositivo Android:
    Galaxy Nexus - Asus Transformer Prime
  • Play Store ID:
    frusso
  • Sistema operativo:
    Ubuntu
Re:parsing di un intero recordset da una activity all'altra
« Risposta #11 il: 07 Agosto 2013, 18:28:49 CEST »
+1
Vedo alcuni problemi nella strada che hai intrapreso.

Se veramente i dati da scaricare dal dababse centrale sono tanti, allora devi pensare a cosa succede se scaricando TUTTI i dati in locale non vai in outOfMemory e poi anche al fatto che avendo un thread nell'activity, cosa succede se l'utente chiude l'app (magari semplicmente ruotando il dispositivo), o squilla il telefono, ....

Se posso suggerirti, io stando a quanto mi hai descritto, farei così:

Quando l'activity al passo 4 ha terminato, tu lanci un IntentService (servizio in background) che:

1) Mostra una notifica all'utente che è inziato la fase di sincronizzazione con il server centrale
2) Interroga il servizio remoto per lo scarico dei dati e li parcheggia sul SQLite interno all'app
3) Terminata la fase di download mostra all'utente una nuova notifica che l'operazione è terminata e se clicca (tap) gli apri la tua seconda activity che stavolta legge dal database locale

In questo modo (mi sembra) forse più facile e più pulito.

ciao

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all'altra
« Risposta #12 il: 07 Agosto 2013, 19:02:43 CEST »
0
Ok grazie del suggerimento,

Posso dire che per evitare  quello che hai descritto ho:
Bloccato la rotazione del dispositivo, anche perché ho studiato il layout per sfruttarlo al masssimo.
Per il tipo di applicazione é consigliato l'impiego di tablet, anziché telefonini, ma su questo, si sa, non sia ha il controllo.

Buono quindi, quello che mi suggerisci, l'avevo scartato a priori (leggi per favore la risposta a crbin1) non mi sembrava fluida, ora ragionando....

Ceklo
« Ultima modifica: 07 Agosto 2013, 20:06:30 CEST da ceklo, Reason: orto...grafia »

Offline jfabrix101

  • Nuovo arrivato
  • *
  • Post: 10
  • jfabrix101 - Android Developer
  • Respect: +2
    • jfabrix101
    • Mostra profilo
    • Fabrizio Russo
  • Dispositivo Android:
    Galaxy Nexus - Asus Transformer Prime
  • Play Store ID:
    frusso
  • Sistema operativo:
    Ubuntu
Re:parsing di un intero recordset da una activity all'altra
« Risposta #13 il: 07 Agosto 2013, 19:10:13 CEST »
+1
Mi sembra che tu poi abbia cambiato idea, nel senso che poi il DB lo svuoti lo stesso

E poi non è detto che un app abbia un solo DB ... ;)

Sent from my ZP950+ using Tapatalk 2


Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:parsing di un intero recordset da una activity all'altra
« Risposta #14 il: 07 Agosto 2013, 19:36:34 CEST »
0
Ciao,

In realtà non ho ancora cambiato idea, posso invece mettere entrambe soluzioni a confronto.
Chissà cosa conviene, in realtà bisogna provarle entrambe e sfruttare il risultato migliore.

Siccome questo progetto é (auto)didattico, non devo rendere il risultato a breve.

Grazie
Ceklo
« Ultima modifica: 07 Agosto 2013, 20:02:51 CEST da ceklo »