2017-05-22 4 views
0

In meiner azurblauen Datenbanktabelle sind mehr als 15 Elemente mit dem Namen Ereignisse enthalten.Android Mobile Apps Abfrage aus der Azure-Datenbank gibt nur die letzte Zeile zurück

Ich habe versucht, die meisten Befehle auf https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-android-how-to-use-client-library wie gefunden auszuführen:

List<Events> results = eventsTable.execute().get() 

und

List<Events> results = eventsTable.select("Events").execute().get(); 

und

List<Events> results = eventsTable.top(20).execute().get(); 

zurückzukehren alle Reihe Artikel in der Tabelle. Die Abfragen scheinen in der letzten Zeile der Tabelle nur ausgeführt zu werden und geben die letzte Zeile oder gar nichts zurück, wenn die Abfrage ausgeführt wird.

Obwohl der ToDoItem Quickstart von Azure funktioniert perfekt mit allen Abfragen - was ist seltsam.

Hier einige der Code

ArrayList<Events> events = new ArrayLists<Events>(); 

private void EventsFromTable() { 

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 
     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       final List<Events> results = EventsTable.execute().get(); 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         for (Events event : results) { 
          Events ev = new Events(event.getName(), event.getVenue(), event.getDate()); 
          events.add(ev); 
          System.out.println("size is " +events.size()); 
          <======This returns "size is 1"======> 
         } 
        } 
       }); 
      } catch (final Exception e){ 
       createAndShowDialogFromTask(e, "Error"); 
      } 

      return null; 
     } 

    }; 
    runAsyncTask(task); 
} 

Könnte jemand wissen, was los ist?

Dank

Antwort

0

Code Nach den variable events scheint eine öffentliche gemeinsame Instanz von ArraryList in Ihrem Android-App zu sein, also ich weiß nicht, ob den Fall existiert, die mehrere Threads es gleichzeitig zugreifen. Die Implementierung der Klasse ArrayList ist nicht synchronisiert, siehe here.

Verwenden Sie daher den Code unten anstelle des Codes ArrayList<Events> events = new ArrayLists<Events>();, wenn Sie die Variable zwischen UI-Thread und asynchronen Task-Thread freigegeben haben.

List<Events> events = Collections.synchronizedList(new ArrayLists<Events>()); 

Und ich denke, es ist besser für aus der Tabelle zu kopieren über addAll Methode abgerufenen Daten, nicht add Methode für jeden, wie der Code unten.

@Override 
public void run() { 
    events.addAll(results); 
} 
Verwandte Themen