如何停止/终止ultralite SELECT语句?

时间:2014-05-23 09:31:13

标签: ios database ultralite

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

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

我有一个ViewController,我开始在背景中进行繁重的READ - 操作,有时需要2-3秒。在同一个ViewController,您可以更改某些值并使用WRITE - 操作保存它,这会取消ViewController

我的问题是,如果我真的很快和/或READ - 操作非常慢,我的ViewController不会被解雇,因为WRITE操作正在等待READ操作的结束{1}} - 操作。用户界面冻结了几秒钟。

要么感谢我的谷歌搜索技能还是可怜的ultralite文档,有谁知道,如何取消当前正在进行的SELECT - 声明?(结果不重要再过了,因为View会被驳回)或者我怎么能同时允许多个陈述?如果重要的话,READWRITE操作使用不同的表

编辑:(总结问题)

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

  3. 更新(详细): 好吧,我们找到了解决办法,但这并没有回答这个问题。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

// Your read operation
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // Query here
        // ....
        // Move back to Main queue
        dispatch_async(dispatch_get_main_queue(), ^{
           // Update UI
        });
    });

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

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    // Write operation
    // ....
});

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

另一种可能的方式:由于ultralite数据库没有记录......我认为可能的方法之一是销毁和创建管理器实例(将单例类修改为非单例),如果这不会崩溃,它将会取消正在运行的操作。

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