Autore Topic: [Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.  (Letto 11530 volte)

Offline maforast

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    Windows 7 Ultimate
Salve, sto approcciando alla programamzione Java su Android. La mia domanda è la seguente:
Ho un db mysql online che interrogo tramite php da un sito sempre online.
Adesso chiedo se sviluppo un'applicazione Java per android, come faccio a interrogare il mio db su internet? Devo per forza utilizzare Json e php? Non posso utilizzare java e tutte le sue librerie?
 
Tnx





Offline lucaodex

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note
  • Play Store ID:
    lucaodex
  • Sistema operativo:
    Windows Vista
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #1 il: 06 Aprile 2012, 17:31:02 CEST »
+1
Ciao,
 la prima cosa da fare è prelevare i dati dal tuo database MySql e trasformarli in formato JSON.
 Questo è possbile con un file php che si troverà sul tuo spazio web come il seguente:

<?php
// parametri del database
$db_host = "<ip-address>";
$db_user = "<database user>";
$db_password = "<database password>";
$db_name = "<database name>";
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri...");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri...");
$q=mysql_query("SELECT * FROM <nome tabella>");
while($e=mysql_fetch_assoc($q))
        $output[]=$e;
print(json_encode($output));
mysql_close();
?>

A questo punto se con un browser accedi a quel file dovresti trovarti i dati del database in formato JSON tipo:

[{"id":"1","Nome":"Pippo","Cognome":"Paperino","mail":"pippo.paperino@disney.com","cell":"3333333333}]

L'applicazione Android è la seguente:

package<package-name>;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class LiukPresencesActivity extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      ListView listView = (ListView) findViewById(R.id.mylist);
      Vector v = new Vector();
      
      String readTwitterFeed = readTwitterFeed();
      try {
         JSONArray jsonArray = new JSONArray(readTwitterFeed);
         
         for (int i = 0; i < jsonArray.length(); i++)
         {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            v.add(jsonArray.getJSONObject(i).getString("Nome") +" "+ jsonArray.getJSONObject(i).getString("Cognome"));
         }
      } catch (Exception e) {
         Toast.makeText(this, "Exception" + e,Toast.LENGTH_LONG).show();
         e.printStackTrace();
      }
      ListAdapter listaContatti = new ArrayAdapter(this, android.R.layout.simple_list_item_1, v);
      listView.setAdapter(listaContatti);
      
      //Toast.makeText(this, "END OF APPLICATION",Toast.LENGTH_LONG).show();
   } //end onCreate

   public String readTwitterFeed() {
      StringBuilder builder = new StringBuilder();
      HttpClient client = new DefaultHttpClient();
      HttpGet httpGet = new HttpGet("<link del tuo file php>");
      
      try {
         HttpResponse response = client.execute(httpGet);
         StatusLine statusLine = response.getStatusLine();
         int statusCode = statusLine.getStatusCode();
         if (statusCode == 200) {
            
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null)
            {
               builder.append(line);
            } //end while
         } else {
            Toast.makeText(this, "Failed to download file",Toast.LENGTH_LONG).show();
         }
      } catch (ClientProtocolException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return builder.toString();
   }
}


Il file AndroidManifest.xml dovrà essere come il seguente:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="liuk.presences"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
   <uses-permission android:name="android.permission.INTERNET"></uses-permission>
   <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity
            android:name=".LiukPresencesActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Il file main.xml dovrà essere come il seguente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:id="@+id/tv"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
/>

<ListView
    android:id="@+id/mylist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</ListView>

</LinearLayout>

Il file string.xml dovrà essere come il seguente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Lista dei soci presenti</string>
    <string name="app_name">Liuk Presences</string>
</resources>

Tieni presente che questa app visualizza in una listview il nome e cognome delle persone presenti nel database.
Ho tolto alcune parti che devi compilare tu in base alle tue esigenze.

Luca

Offline maforast

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    Windows 7 Ultimate
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #2 il: 06 Aprile 2012, 17:42:08 CEST »
0
Grazie 1000 per la risposta. Ero arivato alla conclusione che devo utlizzare Json e php perchè non posso fare interrogazioni all'esterno dello spazio web di aruba ma non avevo ancora implementato il tutto.

Sei stato veramente gentile!

Offline gio

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Olipad 110 con android 3.2
  • Sistema operativo:
    Windows 7
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #3 il: 20 Aprile 2012, 11:33:55 CEST »
0
Ciao, premetto che ho iniziato ieri a sviluppare con java su android. Quello che anche io ho bisogno di fare è collegarmi ad un database Mysq.
Ho creato la pagina php che fa la lettura come in esempio e ho riportato il codice per android sul mio progetto (utilizzo Eclipse).
Per i primi test sto utilizzando un emulatore che naviga in internet e  raggiunge anche la mia pagina php mostrandomi i risultati. Quando lancio l'esecuzione da eclipse ottengo un errore sulla riga HttpResponse response = client.execute(httpGet);
e l'errore è "04-20 09:21:54.344: E/AndroidRuntime(540): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.TestANDMysql/it.TestANDMysql.TestANDMysqlActivity}: android.os.NetworkOnMainThreadException".
ho provato a cercare risposte ma sinceramente non ho trovato nulla. Potete aiutarmi?
Grazie
Gio

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #4 il: 20 Aprile 2012, 14:48:06 CEST »
0
Non puoi lanciare connessioni http sul thread principale. Crea un thread secondario o un AsyncTask dove far girare la richiesta http  ;-)

Offline gio

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Olipad 110 con android 3.2
  • Sistema operativo:
    Windows 7
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #5 il: 23 Aprile 2012, 14:51:49 CEST »
0
Così ho fatto:
"                             while ((line = reader.readLine()) != null)
                              {
                                 builder.append(line);
                                 System.out.println("line " + line);                                 
                              } //end while
"

in corrispondenza di System.out.println ho "04-23 10:59:22.043: I/System.out(425): line <h3>A</h3><p>colonna A</p><hr />[{"ID":"1","Codice":"A","Descrizione":"colonna A"}]<h3>B</h3><p>colonna B</p><hr />[{"ID":"1","Codice":"A","Descrizione":"colonna A"},{"ID":"2","Codice":"B","Descrizione":"colonna B"}]"

ma come recupero i risultati in modo da poterli utilizzare?
se volessi caricare ad esempio uno spinner/listview?
provando ad esempio a inserire l'istruzione test.setText("333"); nel ciclo wile ho un errore.
grazie

Offline enrico.grasso

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #6 il: 01 Agosto 2013, 16:00:59 CEST »
0
Ho utilizzato questo codice per la mia app.

Ho un problema però: su un dispositivo (codice modello GT-S6500 - Android 2.3.6 - API 10) funziona correttamente, mentre se lo mando su un altro dispositivo  (codice modello GT-I9100 - Android 4.0.3 - API 15) l'app va in crash.

Da notare che non gira nel dispositivo con versione più recente.

Sapete dirmi perchè?

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #7 il: 01 Agosto 2013, 16:05:24 CEST »
0
Leggi poco più in alto: non puoi lanciare connessioni HTTP sul thread principale. Su Android 2.X questo solleva solo un warning, su versioni superiori ti trovi un bel crash.

Offline enrico.grasso

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #8 il: 01 Agosto 2013, 17:31:18 CEST »
0
grazie!  ;-)

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #9 il: 18 Settembre 2013, 19:22:51 CEST »
0
Scusate leggevo il post e siccome devo fare la stessa cosa avrei bisogno del vostro aiuto.
Mi domandavo ma è possibile scrivere il server non in php ma in un altro linguaggio di programmazione come java stesso .
Su Internet leggo solamente server implementati in php.

Offline matttt

Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #10 il: 19 Settembre 2013, 08:55:28 CEST »
0
Puoi usare un qualsiasi linguaggio server-side che genera pagine dinamiche, PHP è il più diffuso.
Potresti benissimo costruire la parte server con ASP / ASP.NET se sul web server c'è IIS su Windows. Ma nulla ti vieta di usare Java / JSP se sul server c'è Tomcat. Oppure si potrebbero benissimo usare dei CGI o altri linguaggi di scripting come Perl, Python, Ruby, etc.
Dipende dalla disponibilità che hai sul server e ovviamente se hai un tuo server fai quello che vuoi.
Le mie apps su Google Play Store:

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #11 il: 19 Settembre 2013, 09:25:40 CEST »
0
Considera che il server deve essere più che altro funzionale ,quindi lo farei stare a casa mia lanciando eclipseJEE per esempio dove è installato tomcat.
Quindi va benissimo usare pagine JSP che già conosco.
Altrimenti il php è difficile da imparare?
Tu cosa mi consigli?

E poi avrei un'altra domanda, questo serve per interrogare un database esterno in MySql ,ma se volessi che il database si trovasse anche sul dispositivo android ,cosa dovrei fare ,dovrei effettuare una copia del db esterno mysql in sqlite per esempio e copiarlo dinamicamente in android?

Offline matttt

Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #12 il: 19 Settembre 2013, 19:31:17 CEST »
0
Vuoi creare un'app che si appoggia ad un server fatto in casa? :)
Non è molto professionale secondo me ma ognuno è libero di fare come meglio crede.

Ho usato Tomcat + JSP per un po' di tempo e non mi sono mai trovato bene.
Con PHP invece è tutto più semplice a mio avviso e saresti già apposto se in futuro tu volessi passare ad un provider come Aruba (se non ricordo male con circa 40 eu all'anno hai PHP + MySQL). Prima di decidere definitivamente fai una prova con PHP, online trovi tutto e di più.

Se vuoi farti un server fatto in casa con PHP dovresti installarti Apache + PHP. Su Linux è molto semplice (in funzione della distribuzione diciamo...), su Windows invece devi faticare un po' di più.

Il DB sia sul server che in locale (nel dispositivo)... tipo che se il DB in remoto non è accessibile usi quello locale?
Così è fattibile. Considera che su Android hai un DB SQLite, quindi molto più ridotto rispetto a MySQL. Ma gli elementi base ci sono.

Ultima cosa... se hai altre domande è meglio se apri un nuovo thread :)
« Ultima modifica: 19 Settembre 2013, 23:49:45 CEST da matttt »
Le mie apps su Google Play Store:

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #13 il: 20 Settembre 2013, 15:11:26 CEST »
0
Quello che volevo fare io(penso che tu mi abbia capito) è puramente a scopo funzionale(non deve essere qualcosa di professionale) ,e cioè quello di realizzare un server(semplice direi visto l'utilizzo) che accetta richieste da parte di più client(dispositivi android) che effettuano delle richieste e a seconda della richiesta il server risponde con i dati corretti che vengono prelevati da un database mysql presente sul mio computer(dove risiede il server insomma)
sto iniziando ad usare wamp per realizzare il server(credo vada bene anche se non l'ho mai usato)
per quanto riguarda il db sullo smartphone pensavo di copiare i dati di quello in mysql tutto in sqlite e ad ogni risposta del server di aggiornare dinamicamente il db in android

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:[Java Mysql Android] Cosa usare per interrogare un db Mysql su Aruba.
« Risposta #14 il: 20 Settembre 2013, 15:20:18 CEST »
0
Quello che volevo fare io(penso che tu mi abbia capito) è puramente a scopo funzionale(non deve essere qualcosa di professionale) ,e cioè quello di realizzare un server(semplice direi visto l'utilizzo) che accetta richieste da parte di più client(dispositivi android) che effettuano delle richieste e a seconda della richiesta il server risponde con i dati corretti che vengono prelevati da un database mysql presente sul mio computer(dove risiede il server insomma)

Unico avvertimento che mi permetto di dare: se non ha un IP pubblico, accedere al tuo pc personale da una connessione qualsiasi (esempio 3g), può non essere banale. Se il tutto (server e utenti) è confinato ad una rete locale, allora non hai problemi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store