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