草庐IT

iphone - 将大量 Sqlite 行加载到 UITableView 中

coder 2024-01-11 原文

需要在我的 UITableView 中加载 20,000 个项目,我想知道执行此操作的最佳方法是什么。我目前在 SQLite 中使用直接查询。这会消耗太多内存,并且离开应用程序的速度很慢。

最佳答案

有几个选项:透明地分页数据或实现类似邮件的功能,您可以在其中单击以加载 25 个以上。

如果透明地分页数据

UITableView 具有诸如行的总数据和加载数据之类的回调,因此非常完美,它是虚拟的并且可以重复使用单元格。

但是,您不能进行基本选择,您必须一次选择 x - 例如,一页 50。您必须首先为完整查询选择 count(*),以便知道然后计数。然后,当回调请求第 353 行时,您需要计算第 8 页(读取 50 页),选择这 50 页并返回第 353 行的数据。当请求 354 时,内存中已经有第 8 页,因此您返回。当您越过页面边界时,您将不得不重新选择。内存减少,因为您一次只在内存中保存一页结果。

有趣的问题是如何以稳定的方式一次查询 50 个。最简单的模式是递增稳定的 int id。这取决于你的数据。例如,如果它是一个基于用户的谓词查询,您如何保持 20K,以便您可以一次进入 50 个分页?如果没有内存,您将被迫将用户谓词的结果写入 sqlite 中的另一个表。

如果您想优化,您可以按照用户滚动的方向提前阅读下一页(要求行递增还是递减?)这可能会超过页面边界的停顿。

如果一次加载 25 个以上

那个模式要简单得多。在表格的底部,用户可以点击加载 25 个,然后您更改总数回调并重新加载数据。

权衡?

好吧,显然,分页的好处是无论用户滚动多远,每次都不会将超过一个(或 n)页选入内存。在 25 more 模型中,随着用户对数据集的深入和深入,它会消耗更多的内存。透明分页显然要复杂得多,因此您应该考虑您想要什么样的用户体验以及人们将在多大程度上进入数据集。

最后一点,如果您有那么多行,您将需要一个按字母顺序排列的索引(或类似的概念),以便用户可以跳过那么多数据。您还可以回到绘图板并考虑是否有其他数据或访问模式来避免 View 中出现 20K 行:)

关于iphone - 将大量 Sqlite 行加载到 UITableView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8400069/

有关iphone - 将大量 Sqlite 行加载到 UITableView 中的更多相关文章

  1. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  4. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  5. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  6. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  7. ruby-on-rails - 是否可以让 ActiveRecord 为使用 :joins option? 加载的行创建对象 - 2

    我需要做这样的事情classUser'User',:foreign_key=>'abuser_id'belongs_to:gameendclassGame['JOINabuse_reportsONusers.id=abuse_reports.abuser_id','JOINgamesONgames.id=abuse_reports.game_id'],:group=>'users.id',:select=>'users.*,count(distinctgames.id)ASgame_count,count(abuse_reports.id)asabuse_report_count',:

  8. ruby - 运行 rackup private_pub.ru -s thin -E production 命令时无法加载此类文件 -- thin (LoadError) - 2

    我指的是pubrailscasttutorial并已正确执行所有步骤,但在运行最后一个命令时,即rackupprivate_pub.ru-sthin-Eproduction为了架设faye服务器,我收到以下错误:/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require':cannotloadsuchfile--thin(LoadError)from/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/var/lib/gems/1.9.1/gems

  9. ruby - libxml-ruby 无法在 x86_64 上加载 - 2

    我们在服务器端遇到libxml-rubygem的问题可能是因为它使用x86_64架构:$uname-aLinuxip-10-228-171-642.6.21.7-2.fc8xen-ec2-v1.0#1SMPTueSep110:25:30EDT2009x86_64GNU/Linuxrequire'libxml'LoadError:/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml_ruby.so:invalidELFheader-/usr/local/ruby-enterprise/

  10. Ruby 不从 stdlib 加载 CSV - 2

    我不太确定为什么这不起作用,我一直在寻找解决方案。很简单,我正在运行一个执行require'CSV'的小脚本。,它在我的Mac1.9.3-p327上运行良好,但在p374上的服务器上无法运行。我得到的错误是/home/deployer/.rbenv/versions/1.9.3-p374/lib/ruby/1.9.1/rubygems/custom_require.rb:36:inrequire':cannotloadsuchfile--CSV(LoadError)from/home/deployer/.rbenv/versions/1.9.3-p374/lib/ruby/1.9.1/

随机推荐