草庐IT

ios - ios上的复杂数据结构的sqlite或核心数据

coder 2023-09-28 原文

我要在iPhone / Ipad应用程序中使用非常复杂的数据结构。在摆脱了很多不需要的表并尽可能扁平化数据结构之后。 –
即,如果我有真实结构中的呼叫表和地址表,因为根本不需要更新地址信息,我已经扩展了IOS呼叫表以具有地址信息,而不是链接表–基本上是非规范化的尽我所能减少表的复杂性。

总而言之,我还有15张桌子。

我可以轻松地将表编写脚本到SQLlite中,并在IOS中快速使用SQLlite C API并使其正常运行。

我的问题是–对于具有大量相关表的故障大数据捕获应用程序,我应该坚持使用SQL技能并使用SQLite和C API,还是将其全部转换为coredata?

我对coredata的主要担心是
a)建立时间–是否有一种方法可以从现有的数据库模式(SQL Server,SQLite或脚本)创建coredata数据映射
b)如果我在一个表中有几千行(这是工作中使用的库存项目的列表)。我的理解是coredata会检索该对象的所有项目,然后使用谓词对其进行过滤。这到底是怎么回事,还是我误会了?如果这样做确实有效吗?
c)虽然我尽可能地扁平化了结构,但仍然可能需要将3或4个表连接在一起-核心数据中使用这样的关系是否有效?

如果确实是针对这种情况的更好解决方案,那么重新阅读coredata书籍然后将其应用是没有问题的,只是我阅读的所有书籍和示例都是1或2个实体,具有几个属性且具有单个关系。我的数据库模式,因此我的coredata数据模型要比这复杂得多。
另一个需要考虑的因素是–核心数据是否比sqllite在使用rest服务或JSON从服务器获取数据并将传输完成详细信息放回服务器方面具有任何优势?

请在下面查看我的经验:
万一有人读了这篇文章并想知道我作为SQL Server / ASP.net家伙的经历...。

我开始使用SQLite,我发现它足够快速且易于使用。该API并不是很好,但是作为一个SQL专家,这一点也没有解决我的问题。

我能够使用小型模块轻松地将SQL Server中的表结构编写脚本到生成的脚本中,从而很快在SQLite中使用我的表结构编写脚本

我从具有访问权限的asp.net开始,所以对脚本编写和创建动态SQL字符串并不陌生。但是,我不再希望使用这种方法,因为我觉得它已经过时了,因此尽管在使用SQLite检索数据时可能已经过时了,但我想将数据放入适当的对象中。我想创建对象的数组并编辑对象的属性。在 objective-c 中,这对我来说更有意义。在asp.net中,我仍然不为数据创建对象,我使用SQL Server存储过程,因为我的数据结构非常复杂,并且希望完全控制我查询的所有内容。

但是,要使用AGES来创建用于包装表的类。在核心数据中,只需单击一下即可生成一个代表您的核心数据实体的类,因此,折衷方案是花时间手动生成coredata模式与手动生成用于表示的类数据表/实体/无论您喜欢称呼它们什么。

我在这里选择了核心数据。

您可能需要使用类别来扩展生成的类,但这实际上非常简单,而且非常酷,

coredata的一大优势是fetchedresults控制器可以自动在表格视图中显示更改。由于我的应用程序具有2或3个分层的表视图-在视图2中更改数据,然后返回到表视图,视图1并查看视图1中所做的更新,而无需手动重新加载数据,这非常酷。

谓词还可以。他们有足够的道理,请记住,无论您要获取的对象是什么,您都可以从该对象中横穿关系-同样很酷,有时甚至有些混乱-这是我感觉完全相反的sql思维方式。一旦您习惯了它,它就足够简单而强大。刚开始有点奇怪

NSManaged对象(您存储在核心数据中的任何对象)及其子类都有其自己的managedobjectcontext-即,self.managedObjectContext制作起来很容易,可以显式地保存任何更改,即:

self.name=@"james"
self.favouriteColour=@"blue"

NSError * error;
if ([self.managedObjectContext  save:&error]) {
    NSLog(@"saved");
}

与必须设置sqlite连接,命令并执行它们等相比,这要干净得多。

核心数据API比SQLite API干净得多(好吧是c)。

猜猜我是个convert依者!

最佳答案

首先(您可能之前曾听说过):核心数据不是数据库。它是“具有生命周期,搜索和持久性功能的对象图管理器”,并且本文比我能更好地描述这些差异:http://www.cocoawithlove.com/2010/02/differences-between-core-data-and.html

另请参阅Use CoreData or SQLite on iPhone?及其中的链接,以获取更多可能有用的信息。

现在是您的具体问题:

a)建立时间–是否有创建Coredata数据图的方法
从现有的数据库架构(SQL Server,SQLite或脚本)

不需要。您必须首先创建一个Core Data“模型”(使用Xcode模型编辑器)。模型由具有属性和与其他实体的关系的实体组成。
核心数据具有“持久性存储”,可以是SQLite文件(也可以是“内存中的存储”)。
Core Data使用的架构和表没有正式记录。
您可以尝试直接创建SQLite Core Data存储(格式不太复杂),但是从SQLite迁移到Core Data的最简单方法可能是编写自己的代码,该代码读取SQLite表并创建相应的Core Data对象。

b)如果我在一张表中有几千行(这是库存清单)
作业中使用的项目)。我的理解是核心数据
检索该对象的所有项目,然后使用过滤
谓词。这是真的吗,还是我
误会了吗?如果这样做确实有效吗?

您的理解不正确。核心数据使用“获取请求”来获取数据,可以选择通过“谓词”过滤并通过“排序描述符”进行排序。对于基于SQLite的存储,获取请求将转换为SQL查询并在SQLite级别上执行。 (这对可能的谓词施加了限制,并且并非所有SQL查询都可以通过获取请求来实现。)
仅将获取的对象加载到内存中。

c)在我尽可能扁平化结构的同时,
我仍然可能需要将3或4张桌子连在一起
数据正在使用像这样的关系有效吗?

是。

...与sqllite相比,核心数据是否具有任何优势?
休息服务或JSON以从服务器获取数据并进行传输
完成细节返回服务器?

也许看看RestKit,它具有Core Data支持。但是我对此并不熟悉,因此无法提供有关此问题的更多信息。

关于ios - ios上的复杂数据结构的sqlite或核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427986/

有关ios - ios上的复杂数据结构的sqlite或核心数据的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐