2011-01-11 4 views
0

Also habe ich Code-Beispiele aus dem ganzen Netz verwendet und meine App dazu gebracht, eine .php-Datei auf meinem Server aufzurufen, die JSON-Daten abzurufen, dann die Daten zu parsen und drucke es aus.Wie man Daten manipuliert, nachdem sie über die entfernte Datenbank abgerufen wurden

Das Problem ist, dass es nur für den Zweck des Tutorials, das ich folgte, auf den Bildschirm gedruckt wurde, aber jetzt muss ich diese Daten an anderen Orten verwenden und Hilfe, diesen Prozess herauszufinden.

Das ultimative Ziel ist, meine DB-Abfrage mit Kartenkoordinaten zurückzugeben, dann plotten sie auf einer Google-Karte. Ich habe eine andere App, in der ich manuell Punkte auf einer Karte zeichne, also werde ich diese App mit dieser integrieren, sobald ich mich darüber im Klaren bin, wie man die zurückgegebenen Daten richtig manipuliert.

 public class Remote extends Activity { 
    /** Called when the activity is first created. */ 

     TextView txt; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // Create a crude view - this should really be set via the layout resources 
     // but since its an example saves declaring them in the XML. 
     LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
     txt = new TextView(getApplicationContext()); 
     rootLayout.addView(txt); 
     setContentView(rootLayout); 

     // Set the text and call the connect function. 
     txt.setText("Connecting..."); 
     //call the method to run the data retreival 
     txt.setText(getServerData(KEY_121)); 


    } 
    public static final String KEY_121 = "http://example.com/mydbcall.php"; 

    private String getServerData(String returnString) { 

     InputStream is = null; 

     String result = ""; 
     //the year data to send 
     //ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     //nameValuePairs.add(new BasicNameValuePair("year","1970")); 

     try{ 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(KEY_121); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

     }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 

     //convert response to string 
     try{ 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
       } 
       is.close(); 
       result=sb.toString(); 
     }catch(Exception e){ 
       Log.e("log_tag", "Error converting result "+e.toString()); 
     } 
     //parse json data 

     try{ 
       JSONArray jArray = new JSONArray(result); 
       for(int i=0;i<jArray.length();i++){ 
         JSONObject json_data = jArray.getJSONObject(i); 
         Log.i("log_tag","longitude: "+json_data.getDouble("longitude")+ 
           ", latitude: "+json_data.getDouble("latitude") 
         ); 
         //Get an output to the screen 
         returnString += "\n\t" + jArray.getJSONObject(i); 
       } 
     }catch(JSONException e){ 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 

     return returnString; 
    } 

    } 

So ist der Code:

returnString += "\n\t" + jArray.getJSONObject(i); 

ist, was derzeit auf dem Bildschirm gedruckt wird.

Was ich habe, um herauszufinden, wie die Daten in etwas zu bekommen, die ich in anderen Stellen im Programm verweisen kann, und die einzelne Elemente zugreifen dh:

double longitude = jArray.getJSONObject(3).longitude; 

oder etwas in diesem Sinne ..

Ich denke, die Klasse getServerData muss einen Array-Typ oder etwas zurückgeben?

Jede Hilfe ist willkommen, danke.

Antwort

0

Als Erstes sollten Sie keine Serveraufrufe auf dem UI-Thread ausführen. Verwenden Sie AsyncTask oder Service, um Remoteaufrufe in einem separaten Thread auszuführen.

Als nächstes kenne ich nicht die genaue Struktur der zurückgegebenen Json, aber es klingt wie Sie es in ein saubereres Objektmodell konvertieren möchten. Erstellen Sie einfach ein Objekt, das für jeden Eintrag in Ihrem Json-Array ein Feld enthält, und ersetzen Sie Ihre Protokollanweisungen durch Zuweisungsanweisungen. Ie:

class Location { 
    private double latitude; 
    private double longitude; 
    public Location(double latitude, double longitude) { ....} 
} 

private List<Location> getServerData(String returnString) { 
List<Location> result = new ArrayList<Location>(); 
JSONArray jArray = new JSONArray(result); 
for(int i=0;i<jArray.length();i++){ 
    Location loc = new Location(json_data.getDouble("latitude"), json_data.getDouble("longitude")); 
    result.add(loc); 
} 
return result; 
} 
+0

Ich mache, wie Sie beschrieben, und Ergebnis zurückgeben, die ein Array meiner Klasse Location ist. Schnelle Frage, wie kann ich auf diese Daten zugreifen, nachdem ich etwas wie result.get (location) zurückgegeben habe? – bMon

+0

Sie sollten auf Arrays und Listen in Java nachlesen. Sie sind ziemlich einfach, viel Dokumentation: http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html http://download.oracle.com/javase/tutorial/collections /interfaces/list.html –

+0

Danke, Mayra, schätze es. – bMon