我将在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提供了任何优势来使用休息服务或JSON从服务器获取数据并将传输完成详细信息返回给服务器?
请参阅下面的经验: 万一有人读这篇文章,想知道我作为SQL Server / ASP.net家伙的经历....
我开始使用SQLite,我发现它使用起来既快捷又简单。 API并不是很好,但作为一个SQL人员,这根本就没有我。
我能够使用小mods轻松地从SQL Server编写表结构到生成的脚本,让我在SQLite中快速地使用我的表结构
我从asp.net开始访问,所以我对编写脚本和创建动态SQL字符串并不陌生。然而,我不再想使用这种方法,因为我觉得它已经过时了,所以尽管我使用SQLite来检索数据可能有些过分,但我想把数据放到一个合适的对象中。我想创建我的对象数组并编辑对象的属性。它在目标C中对我更有意义。在asp.net中我仍然不为我的数据创建对象,我使用SQL Server存储过程,因为我有一个非常复杂的数据结构,并希望完全控制我查询的所有内容。
然而,创建用于包装表的类需要AGES。在核心数据中,单击即可生成代表您的核心数据实体的类,因此需要花时间手动生成coredata模式vs手动生成类来表示数据表/ entites /您想要调用它们的任何内容。
我在这里选择了核心数据。
您可能需要使用类别来扩展已生成的课程,但这实际上非常简单,非常酷,
coredata的一大优势是fetchedresults控制器自动显示表视图中的更改。因为我的应用程序有2或3个表级视图,这些视图是分层的 - 在视图2中更改数据,然后返回到tableview,查看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)。
猜我是转换!
答案 0 :(得分:4)
首先(你之前可能听说过):核心数据不是数据库。它是一个“具有生命周期,搜索和持久性功能的对象图管理器”,本文将比我更好地描述差异: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模型编辑器)。模型由具有属性和与其他实体的关系的实体组成。 Core Data具有“持久存储”,可以是SQLite文件(也可以是“内存存储”)。 Core Data使用的模式和表格是官方未记录的。 您可以尝试直接创建SQLite核心数据存储(格式不是太复杂),但从SQLite迁移到Core Data的最简单方法可能是编写自己的代码来读取SQLite表并创建相应的Core Data对象。
b)如果我在一张桌子上有几千行(这是一张库存清单 在工作中使用的项目)。我的理解是coredata 检索该对象的所有项目,然后使用过滤它们 谓词。这是它真的如何运作,或者我 误解?如果它的行为像这样有效吗?
您的理解不正确。核心数据使用“获取请求”来获取数据,可选地由“谓词”过滤并按“排序描述符”排序。对于基于SQLite的存储,获取请求将转换为SQL查询并在SQLite级别上执行。 (这对可能的谓词施加了限制,并且对于获取请求,并非所有SQL查询都是可能的。) 只有获取的对象才会加载到内存中。
c)虽然我尽可能地平整了结构,但那里 仍然可能需要我加入3或4个表 - 核心 数据使用这样的关系是否有效?
是
...核心数据提供的优势超过sqllite消费 休息服务或JSON从服务器获取数据并进行传输 完成详细信息回到服务器?
或许查看具有Core Data支持的RestKit。但我对此并不熟悉,所以我无法提供有关此问题的更多信息。