Android 来自 Azure 数据库的移动应用程序查询 returns 仅最后一行

Android Mobile Apps query from the azure database returns last row only

我的 Azure 数据库 table 中有超过 15 个项目称为事件。

我已经尝试 运行 上找到的大多数命令 https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-android-how-to-use-client-library 如:

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

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

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

到return table 中的所有行项目。查询似乎 运行 在 table 的最后一行 只有 和 return 是最后一行,或者在执行查询时根本没有。

尽管 Azure 的 ToDoItem Quickstart 可以完美地处理所有查询 - 这很奇怪。

这是一些代码

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);
}

有人知道这是怎么回事吗?

谢谢

根据您的代码,变量 events 似乎是 Android 应用程序中 ArraryList 的 public 共享实例,所以我不知道是否存在多个线程并发访问它的情况。 ArrayList class 执行不同步,请看here.

因此,当您在 UI 线程和数据异步任务线程之间共享变量时,请使用下面的代码而不是代码 ArrayList<Events> events = new ArrayLists<Events>();

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

而且我认为通过 addAll 方法复制从 table 检索到的数据更好,而不是每个方法的 add 方法,如下面的代码。

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