Autore Topic: Scaricare dati da internet  (Letto 1213 volte)

Offline Lucart98

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 (32GB, Nero)
  • Sistema operativo:
    Windows 7
Scaricare dati da internet
« il: 02 Marzo 2014, 00:57:27 CET »
0
Bonjour  :-)
Ho una pagina web che contiene un elenco di elementi.
Dovrei, dalla mia app, aggiornare gli elementi quando questa si connette ad Internet.
In pratica aprirei l'app, visualizzerei gli elementi salvati precedentemente, controllerei in background se ce ne sono di nuovi e li aggiungerei all'elenco.
Mi conviene utilizzare sql vero?
Come potrei interfacciare l'app con il db esterno? Considerate che con PHP/mysql me la cavo abbastanza bene, dovrei solo sapere come costruire la pagina.
Ci sono manuali/guide in italiano/inglese (ovviamente preferirei l'italiano  :-P)?

Grazie e scusate se è già stato chiesto, ma non so come cercare.  :'(

Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Scaricare dati da internet
« Risposta #1 il: 06 Marzo 2014, 12:28:06 CET »
0
Bonjour Lucart98,

allora, la tua domanda è un pò generica e non si concentra su un problema preciso, ma su molteplici.
Io ho sviluppato in java la parte server dell'applicazione, è ovviamente fattibile e anche più economica la scelta di affrontare con php/mysql.
Nella tua activity dovrai creare un thread che si connette alla tua pagina.php .
Posso postarti per iniziare un pezzo di codice che dovrai utilizzare nella tua Activity per poter leggere la risposta che riceverai:

Codice (Java): [Seleziona]
 // This handler will be notified when the service has responded.
    final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                    dialog.dismiss();
                    if (msg.what == CODE_ERROR) {
                            Toast.makeText(RecensisciEsameStepTwoActivity.this, "Service error.", Toast.LENGTH_SHORT).show();
                    }
                    else if (msg.what == CODE_OK) {
                            Log.i(TAG, "Chiamata servlet eseguita");
                            if("OK".equalsIgnoreCase(resultString.trim())){
                               
                                Toast.makeText(Activity.this, "Risposta:"+resultString, Toast.LENGTH_SHORT).show();
                                Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
                                        myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                       
                                        startActivity(myIntent);
                                        return;
                            }else{
                                Toast.makeText(Activity.this, "Errore..", Toast.LENGTH_SHORT).show();
                                return;
                            }
                    }
            }
    };
   
        private void callService() {

        // Show a loading dialog.
        dialog = ProgressDialog.show(this, "Loading", "Calling service php...", true, false);

        // Create the thread that calls the webservice.
        Thread loader = new Thread() {
                public void run() {

                        // init stuff.
                        Looper.prepare();
                       
                        boolean error = false;

                        // build the webservice URL from parameters.
                        String wsUrl = "http://192.168.0.100:8080/tuoProgetto/pagina.php";
                       
                       
                        Log.d(TAG,wsUrl);
                        String wsResponse = "";

                        try {
                                // call the service via HTTP.
                                wsResponse = readStringFromUrl(wsUrl,recEsame);
                                resultString = wsResponse;
                                 
                               
                        }
                        catch (IOException e) {
                                // IO exception
                                Log.e(TAG, e.getMessage(), e);
                                error = true;
                        }
                        catch (IllegalStateException ise) {
                                // Illegal state: maybe the service returned an empty string.
                                Log.e(TAG, ise.getMessage(), ise);
                                error = true;
                        }
                       
                       
                        if (error) {
                                // error: notify the error to the handler.
                                handler.sendEmptyMessage(CODE_ERROR);
                        }
                        else {
                                // everything ok: tell the handler to show cities list.
                                handler.sendEmptyMessage(CODE_OK);
                        }
                }
        };

        // start the thread.
        loader.start();
        }
       
         private String readStringFromUrl(String fileURL) throws IOException {
         
         InputStream is = null;
         BufferedInputStream bis = null;
             ByteArrayBuffer bufH = new ByteArrayBuffer(512);
             byte[] bufL = new byte[512];

         if (checkConnectivity()) {
                 HttpURLConnection urlConnection=null;
                 try {
           
                         final HttpClient httpClient = new DefaultHttpClient();
                         final HttpPost httpPost = new HttpPost(fileURL);
                         //lista parametri in post
                         List <NameValuePair> nvps = new ArrayList <NameValuePair>();
                         nvps.add(new BasicNameValuePair("parametroDaPassare", "passaQuelloCheTiserve"));
                         
                         //end list parameter
                         
                         
                         httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8"));
                         HttpResponse response = httpClient.execute(httpPost);
                         
                         final HttpEntity entity = response.getEntity();
                         StringBuilder builder = new StringBuilder();
                         InputStream content = entity.getContent();
                         BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                         String line;
                         while ((line = reader.readLine()) != null) {
                             builder.append(line);
                         }
                         
                         Log.d(TAG,builder.toString());
                         content.close();
                         return builder.toString();
                         //****END*****

                 }
                 catch (SocketTimeoutException ste) {
                         throw ste;
                 }
                 catch (IOException ioe) {
                         throw ioe;
                 }
                 finally {
                         
                         try {
                                 if(urlConnection!=null) urlConnection.disconnect();
                                 if (bis != null) {
                                         bis.close();
                                 }
                                 if (is != null) {
                                         is.close();
                                 }
                                 
                         }
                         catch (IOException e) {        }
                 }
                 
         }
         else {
                 throw new IOException("Download error: no connection");
         }
         }
 
         private boolean checkConnectivity() {
         ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
         if (cm == null)
                 return false;
         NetworkInfo infoMobi = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
         NetworkInfo infoWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
         NetworkInfo.State connectionMobi = NetworkInfo.State.DISCONNECTED;
         NetworkInfo.State connectionWifi = NetworkInfo.State.DISCONNECTED;
         if (infoMobi != null)
                 connectionMobi = infoMobi.getState();
         if (infoWifi != null)
                 connectionWifi = infoWifi.getState();
         return (connectionMobi == NetworkInfo.State.CONNECTED) || (connectionWifi == NetworkInfo.State.CONNECTED);
 }

Per completare il tutto sul tuo Manifest dovrai inserire:
Codice (XML): [Seleziona]
 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

Non ho provato, ma se nella tuapagina.php inserisci:
Codice (PHP): [Seleziona]
<?php echo("Ciao Mondo !"); ?>
Sulla tua applicazione nel Toast potrai notare la risposta ottenuta!
Se hai domande rimango a disposizione!!!  ;-)

Offline Lucart98

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 (32GB, Nero)
  • Sistema operativo:
    Windows 7
Re:Scaricare dati da internet
« Risposta #2 il: 06 Marzo 2014, 13:41:24 CET »
0
Innanzitutto grazie per la risposta, ci avevo quasi perso le speranze :D
Qualche domanda l'avrei...

1.
Codice (Java): [Seleziona]
Log.i(TAG, "Chiamata servlet eseguita");Cos'è "Log.i"? Cosa devo mettere al posto di TAG?

2.
Codice (Java): [Seleziona]
if("OK".equalsIgnoreCase(resultString.trim())){Perché resultString me lo segna?

3.
Codice (Java): [Seleziona]
wsResponse = readStringFromUrl(wsUrl,recEsame);Cos'è readStringFromUrl? Ho cercato senza trovare alcuna documentazione.
Quindi il primo valore sarebbe l'URL da richiamare, ma il secondo?

A questo punto dovrebbe funzionare, anche se c'è un piccolo avviso che mi dice di far diventare l'handler una classe statica (WTF??)   o_O

Un po' ho capito come funziona, anche se mi manca la parte del "salvare i risultati nel db interno", ma a quello ci penserei dopo.
Grazie mille  :D

Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Scaricare dati da internet
« Risposta #3 il: 06 Marzo 2014, 14:13:04 CET »
0
Ciao,
ho fatto copia incolla dal mio progetto e mi sono rimaste dentro delle cose inutili.
Procedo per punti:

Citazione
Cos'è "Log.i"? Cosa devo mettere al posto di TAG?
Log.i("","Meggaggio"); Serve per loggare ciò che ti interessa tracciare. TAG è una mia variabile di tipo String che ha il nome del progetto. Cosi quando loggo i messaggi che mi interessano verrà scritto nome_progetto : meggaggio scritto

Citazione
Perché resultString me lo segna?
resultString è una variabile String, nel mio caso il servizio mi restituiva OK o KO, quindi io controllavo la risposta se era ok o ko.

Citazione
Cos'è readStringFromUrl? Ho cercato senza trovare alcuna documentazione.
Quindi il primo valore sarebbe l'URL da richiamare, ma il secondo?

il secondo è un parametro che mi è rimasto dal copia e incolla. Dovresti richiamarlo cosi:

Codice (Java): [Seleziona]
wsResponse = readStringFromUrl(wsUrl);
readStringFromUrl(String) è il metodo che ti ho messo nel post di prima, è il metodo che effettua la chiamata e legge la risposta.

Offline Lucart98

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 (32GB, Nero)
  • Sistema operativo:
    Windows 7
Re:Scaricare dati da internet
« Risposta #4 il: 06 Marzo 2014, 16:07:02 CET »
0
Sei il mio Dio.
Funziona perfettamente.
Senti ma READ_PHONE_STATE serve a controllare se sono attivati WiFi/dati?
Non c'è già ACCESS_NETWORK_STATE per quello?
Te lo chiedo perché quando rilascio un aggiornamento con un nuovo permesso lo scarica la metà delle persone, dato che occorre confermarlo (e, appunto, la maggior parte non sa neanche come si fa).

Bene, sei riuscito a farmi capire come collegare la mia app al mio sito.
Cosa mi consigli di fare per quanto riguarda il salvataggio dei dati sul database locale?
Innanzitutto, dato che la mia app contiene un elenco di citazioni, dovrei dividere ogni record.
Quindi, se ad esempio sono presenti 3 citazioni, la pagina PHP sarà questa:
Codice: [Seleziona]
1|1|Citazione 1
2|3|Citazione 2
3|2|Citazione 3

// con:
// ID|Posizione|Testo
Dunque, tramite JAVA (dall'app), devo separare i vari record ogni volta che incontro "\n".
Infine sistemare correttamente le colonne effettuando lo stesso procedimento con il delimitatore "|".
Ecco cosa sono riuscito a scrivere:
Codice (Java): [Seleziona]
String result = resultString;
String[] righe = result .split("\n");
for(String riga:righe) {
        String[] colonne = val.riga("|");
        database.execSQL("TRUNCATE Frasi");
        database.execSQL("INSERT INTO Frasi(ID,Pos,Testo) VALUES('"+colonne[0]+"','"+colonne[1]+"','"+colonne[2]+"')");
}

È corretto?
Se sì, manca soltanto la configurazione del database :-)
Grazie mille ancora :D

Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Scaricare dati da internet
« Risposta #5 il: 06 Marzo 2014, 17:05:45 CET »
0
Citazione
Senti ma READ_PHONE_STATE serve a controllare se sono attivati WiFi/dati?
Non c'è già ACCESS_NETWORK_STATE per quello?

Si si errore di copia incolla, non ti serve questo permesso!!

Per quanto riguarda il discorso di Splittare...... Ci sarebbe un metodo più bello per approcciarlo,
potresti farti restituire un json dalla tuapagina.php e leggere il json dalla tua activity. Per fare ciò ti può essere molto utile la libreria Gson di Google. Trovi molti esempi su internet.


Tuttavia anche la tua soluzione, se pur macchinosa, dovrebbe funzionare...  ;-)

Offline Lucart98

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 (32GB, Nero)
  • Sistema operativo:
    Windows 7
Re:Scaricare dati da internet
« Risposta #6 il: 07 Marzo 2014, 18:27:29 CET »
0
Avevo pensato anche io a JSON, ma prima di correre bisogna saper camminare 8-)
Comunque, sono riuscito a creare il database, creare la tabella e probabilmente ho anche inserito i record ottenuti dal server.
Dico probabilmente perché non so come verificare, come prelevare i dati. In PHP me ne uscirei con un while ed un mysqli_fetch_array, ma su Java non so proprio come muovermi.

Prima, però, vorrei chiederti una cosa: ho seguito questa utilissima guida, ma io voglio fare le cose "pure", per cui invece di scrivere:
Codice (Java): [Seleziona]
ContentValues contentValues = new ContentValues();
 
contentValues.put("_id", split1[0]);
contentValues.put("Pos", split1[1]);
contentValues.put("Testo", split1[2]);
 
//Accedo al database in scrittura
SQLiteDatabase db = mMioDbHelper.getWritableDatabase();
db.insert("Frasi", null, contentValues);
non potrei scrivere semplicemente:
Codice (Java): [Seleziona]
db.execSQL("INSERT INTO Frasi(_id,Pos,Testo) VALUES("+split1[0]+","+split1[1]+",'"+split1[2]+"')");Mi verrebbe più facile sia per l'inserimento che per il prelievo dei dati.
E soprattutto capirei meglio ciò che faccio :-)

Tornando al discorso di prima, come potrei eseguire un ciclo per ogni riga della tabella? E come selezionare il campo che mi serve?
Grazie mille ancora :D

Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Scaricare dati da internet
« Risposta #7 il: 10 Marzo 2014, 09:54:21 CET »
0
Allora..........
In android puoi ovviamente replicare il discorso che tu fai con php mysqli_fetch_array .
Come prima cosa però devi fare una select sul db; per fare ciò io ho fatto una classe che estende SQLiteOpenHelper (classe di android) e all'interno ho fatto un metodo con questo contenuto:
Codice (Java): [Seleziona]
                        Cursor c = getReadableDatabase().query(CLASSEMITABELLA.TABLE_NAME, CLASSEMITABELLA.COLUMNS,
                                        CLASSEMITABELLA.NOME + " = ? ", new   String[] {MIOVALORE}, null, null, null);
                       
                        return c;

Nell'activity richiamo il metodo che ho fatto e ciclo il Cursor in questo modo:
Codice (Java): [Seleziona]
while(cursor.moveToNext()){


}


Ti può essere di aiuto questo: http://stackoverflow.com/questions/17524704/exception-while-reading-data-through-cursor-from-sqlite-database-in-android

Offline Lucart98

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 (32GB, Nero)
  • Sistema operativo:
    Windows 7
Re:Scaricare dati da internet
« Risposta #8 il: 24 Marzo 2014, 21:10:24 CET »
0
Scusa se rispondo solo adesso.
Ci sono riuscito, ho completato la parte della connessione dell'app, non sai quanto ti ringrazio :D

Ecco qui il codice se dovesse servire a qualcuno...
Codice (Java): [Seleziona]
List<String> citazioni1 = new ArrayList<String>();
       
        SQLiteDatabase db = mMioDbHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM Frasi ORDER BY Pos ASC", null);
        while(cursor.moveToNext()){
                citazioni1.add(cursor.getString(cursor.getColumnIndex("Testo")));
        }
        String[] citazioni = citazioni1.toArray(new String[citazioni1.size()]);
       
        listview = (ListView) findViewById(R.id.ListViewCitazioni);
        listview.setAdapter(new yourAdapter(this, citazioni));

Grazie mille ancora :-)