android - Sqlite Azure 移动服务 SDK 中的连接池已关闭

标签 android database sqlite connection azure-mobile-services

在我的 Android 项目中,我使用 Azure 移动服务 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 对象。我能做什么?

谢谢!

最佳答案

我认为这是因为您在一个线程中获得结果,但试图在 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) {

                    }
                });

关于android - Sqlite Azure 移动服务 SDK 中的连接池已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166941/

相关文章:

java - 每次打开 Android 虚拟设备时,Android SQLite 数据库都不会保留它的值

mysql - 如何根据约束确定列中值的计数?

Android ORMLite : one object but two tables

Android AChartEngine - 无法更改 Y 轴标签的文本颜色

android - 在改造中在 json 对象中发布数组?

Mysql 查询更新行是否存在?

MySQL - 查找具有相同列但匹配某些 ID 的行

sqlite - 可以创建按星期几排序的查询吗?

java - 如何在使用 java 显示数据库中的数据时将文本水平居中

java - 如何在java中使用Cocos2d创建动画?