2013-03-15 64 views
4

我有一个相当复杂的数据结构,我打算在iPhone/iPad应用程序中使用。在摆脱了许多不需要的表格之后,尽可能地将数据结构扁平化。 - 也就是说,如果我有一个实际结构中的调用表和地址表,因为我根本不需要更新地址信息,所以我扩展了IOS调用表以获取地址信息而不是链接表 - 基本上是de尽可能地减少表格复杂度。对ios上的复杂数据结构的sqlite或coredata

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

我可以很容易地将表脚本编写到SQLlite中,并且可以快速使用IOS中的SQLlite C API并使其工作正常。

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

我与coredata主要的担心是 一)建立时间 - 有从现有的数据库模式创建coredata映射数据(SQL服务器,SQLite的或脚本) 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来检索数据,但我想将数据放入适当的对象中。我想创建我的对象的数组并编辑我的对象的属性。它在目标C中对我更有意义。在asp.net中,我仍然不为数据创建对象,我使用SQL Server存储过程,因为我有一个非常复杂的数据结构,并且想要完全控制我查询的所有内容。

然而,需要AGES创建类来包装你的表。在核心数据中,只需单击一下即可生成表示核心数据实体的类,因此,权衡是花费时间手动生成coredata模式,而不是手动生成类来表示数据表/实体/无论您更喜欢调用它们。

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

,你可能会需要使用类别来扩展生成的类,但其实这是很容易,也很冷静,

一个coredata的最大优势是自动显示在表视图变化fetchedresults控制器。因为我的应用程序有2到3个层次结构的表视图 - 在视图2中更改数据,然后返回到tableview,查看1并查看视图1中的更新,而无需手动重新加载数据,这非常酷。

谓词可以。他们具有足够的理性,牢记,无论你提取什么对象,都可以从这个对象中横切关系 - 如果有时候有点混乱,它也很酷 - 这完全是从我觉得的sql思维的倒退方式。一旦你习惯了它,它足够简单并且足够强大。这只是一个位在第一

NSManaged对象(任何对象要存储在核心数据)怪异及其subclasss有自己managedobjectcontext - 即self.managedObjectContext决策是一件轻而易举的事明确地保存任何变化,即:

[email protected]"james" 
[email protected]"blue" 

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

它比建立sqlite连接,命令和执行它们要干净得多。

核心数据API比SQLite API(很好,它是c)更清洁。

猜想我是一个转换!

+0

我不知道为什么这是-1'd?我很抱歉,但如何阅读2本书300多页专门coredata书页不构成研究?我读到的内容很短,只涉及简单的例子,而不是我想要实现的内容,这更复杂。社区是问问题,他们不是?说我没有试图找到我自己是非常不公平的。如果我能找到一个符合我需求的示范演示或优秀文章,我不会花时间打字问题吗? – 2013-03-15 08:58:38

+0

完全同意你的看法。好问题,我也对这个答复感兴趣。 – 2013-03-17 12:45:12

+0

FMDB(https://github.com/ccgus/fmdb)是一个很好的用于sqlite的Objective-C接口。随着DAO模式,它可以提供非常整洁的代码。如果您需要细粒度的控制,如事务回滚/提交,自定义SQL等,可能是一个不错的选择。 – 2013-12-29 14:37:30

回答

4

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

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

我们您的具体问题:

一)建立时间 - 有从现有的数据库模式创建coredata数据映射 (SQL服务器,SQLite的或脚本)

的方式

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

b)如果我有一个表中的几千行(这是在作业上使用的库存 项目列表)。我的理解是,coredata 检索该对象的所有项目,然后使用 谓词筛选它们。这究竟是如何运作的,还是我误解了?如果它的行为如此有效,这是否有效?

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

C)虽然我已经夷为平地结构尽可能有 仍然可能是一个需要我加入3或4表一起 - 核心 数据是使用像这样高效的关系?

是的。

...没有核心数据提供了sqllite任何优势,为消费 休息服务或JSON来从服务器获取数据,并把传输 完成细节回服务器?

也许看看RestKit,它具有核心数据支持。但我对此并不熟悉,所以我无法提供关于这个问题的更多信息。

+0

感谢您的答案,抱歉没有回复,因为我没有看到它。一个很好的答案 - 我将以SQL Server/ASP.net开发人员的身份添加自己的经验。 – 2013-04-23 13:10:41