在我的Android项目中,我使用Azure Mobile Services SDK,我对本地sqlite数据库进行查询的方式如下: (例子来自http://azure.microsoft.com/en-us/documentation/articles/mobile-services-android-get-started-data/)。
问题是我收到以下错误: 1)com.microsoft.windowsazure.mobileservices.table.sync.localstore.MobileServiceLocalStoreException:java.lang.IllegalStateException:由于连接池已关闭,无法执行此操作
2)数据库'LocalDatabase'的SQLiteConnection对象泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库
3)java.util.concurrent.ExecutionException:com.microsoft.windowsazure.mobileservices.table.sync.localstore.MobileServiceLocalStoreException:java.lang.IllegalStateException:尝试重新打开已经关闭的对象
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
final MobileServiceList<ToDoItem> result = mToDoTable.where().field("complete").eq(false).execute().get();
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.clear();
for (ToDoItem item : result) {
mAdapter.add(item);
}
}
});
} catch (Exception exception) {
createAndShowDialog(exception, "Error");
}
return null;
}
}.execute();
在此实现中,没有要关闭的Cursor或SQLiteOpenHelper对象。我该怎么办?
谢谢!
答案 0 :(得分:0)
我认为这是因为您在一个线程中获得结果但是尝试在UI线程中使用相同的结果。一种可能的方法是在操作完成后使用Broadcast或Eventbus将数据发送回UI:
以下是我要做的事情:
Futures.addCallback(mToDoTable.where().field("complete").eq(false).execute(), new FutureCallback() {
@Override
public void onSuccess(Object result) {
//Do something with result
//I would use event bus or broadcast here to notify the UI
}
@Override
public void onFailure(Throwable t) {
}
});
如果这不起作用,我会使用调试器并在execute()。get()行上设置一个断点,看看内部发生了什么。
这是另一种可能的方法:
mToDoTable.where().field("complete").eq(false).execute(new TableQueryCallback<Object>() {
@Override
public void onCompleted(List result, int count, Exception exception, ServiceFilterResponse response) {
}
});