1

只是想知道是否可以取消或停止选择语句?

我有一个带有 sap ultralite 数据库的应用程序。数据库连接和语句在单例中处理。

我有一个ViewController在后台启动繁重操作的地方READ,有时需要 2-3 秒。同时ViewController,您可以更改一些值并使用 - 操作将其保存WRITE,从而消除ViewController.

我的问题是,如果我真的很快和/或 -READ操作非常慢,我的 ViewController 不会被解雇,因为该WRITE操作正在等待 - 操作结束READ。所以 UI 冻结了几秒钟。

由于我的谷歌搜索技能或糟糕的 Ultralite 文档,有谁知道,我怎样才能取消当前正在进行的SELECT声明?(结果不再重要,因为 View 将被解雇)或者我怎样才能同时允许多个语句READ和操作使用不同的WRITE表,如果这很重要的话

编辑:(总结问题)

  1. 是否可以READ同时WRITE使用ultralite
  2. 如果没有,还有其他解决方案吗?(目前我们正在测试复制数据库)

更新(详细): 好吧,我们找到了解决方法,但这并不能回答问题。

我们有一个带有ShoppingCard ListView的应用程序(项目存储在 ultralite 数据库中)。Freeform-ViewController在此视图中,您可以更改显示一些统计数据的项目(更改发货日期、数量...)。

统计数据是繁重的READ操作,有时最多需要五秒钟。因此,例如,如果您更改项目的数量并按下DONE按钮,则Freeform-ViewController启动WRITE- 操作(更新),被解除并更新 ShoppingCard(再次READ到数据库以获取更改)。

最后一点是坏事,但我们为 实现了一个完成处理程序FreeformVC,它只更新一个项目而不是READ数据库中的整个购物卡。这似乎可行,但是,它不是最好的解决方案。如果你点击的速度真的很快,如果你想再次从数据库中读取,你有时会感到延迟,所以问题仍然存在......

4

1 回答 1

0

首先将您的数据库查询代码移动到另一个队列(这是一个很好的做法)

解决方案是:开始排队你的数据库操作。这个解决方案非常简单,诀窍是将您的数据库查询分派到另一个队列

// 你的读操作
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // 这里查询
        // ....
        // 移回主队列
        dispatch_async(dispatch_get_main_queue(), ^{
           // 更新用户界面
        });
    });

在此之后你的写操作做同样的事情

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    // 写操作
    // ....
});

此解决方案不会取消读取操作,但 UI 不会再冻结(ViewController 将关闭,但操作将继续运行直到完成)。

另一种可能的方法:由于未记录超轻数据库...我认为一种可能的方法是销毁并创建管理器实例(将您的单例类修改为非单例),如果这不会崩溃,它将取消运行手术。

另一种可能的方法:使用NSOperations,并尝试取消操作......也许“ultralite”会检查取消状态,并停止查询。

于 2014-05-30T12:31:24.400 回答