2014-05-23 61 views
1

只是想知道是否可以取消或停止选择语句?如何停止/终止ultralite SELECT语句?

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

我有一个ViewController在那里我开始一个沉重的READ - 在后台有时需要2-3s的操作。在同一个ViewController中,您可以更改一些值并将其保存为WRITE-操作,该操作忽略了ViewController

我的问题是,如果我真的快和/或READ - 操作很慢,我的ViewController没有被驳回,因为WRITE操作正在等待READ诚合作的结束。所以UI冻结了几秒钟。

要么感谢我的谷歌搜索技能或可怜的ultralite文档,没有人知道,我怎样才能取消当前正在进行的SELECT -statement?(结果不再重要,因为View将被解雇)或者我怎样才能同时允许多个陈述?该READWRITE操作不同的表时,如果这是很重要

编辑:(总结题)

  1. 是否有可能READWRITE在同一时间的UltraLite
  2. 如果没有,是否还有其他解决方案? (目前,我们测试复制的数据库)

UPDATE(详细): 嗯,我们发现了一个变通,但这并不回答这个问题。

我们有一个应用程序一个ShoppingCardListView(项存储在UltraLite数据库)。在此视图中,您可以在Freeform-ViewController内更改项目(更改运输日期,数量...),其中显示了一些统计数据

统计信息是繁重的READ操作,有​​时最多需要5秒。所以,如果你例如更改项目的金额,然后按DONE键,Freeform-ViewController开始WRITE -operation(UPDATE),被驳回,ShoppingCard被(再次READ到数据库中得到改变)进行更新。

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

+1

您可以将您的读/写操作放在后台队列中,以便您的UI保持响应。您可以使用Grand Central Dispatch('dispatch_async'到后台队列,然后在完成读取/写入时返回到主队列)或“NSOperationQueue”。只要确保你的数据库类是线程安全的。 –

+0

@AaronBrager:读/写操作在后台。如果'READ'花费的时间过长,所以第二个'WRITE'语句必须等待,直到第一个准备好(< - 这会导致'UI'冻结) – longilong

+0

如果'WRITE'语句处于背景,那么它不应该导致UI冻结。什么阻止主线程? –

回答

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 
    // .... 
}); 

该解决方案将不会取消读操作,但用户界面不会冻结(ViewController会关闭,但这些操作会一直运行直到完成)。

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

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