NSManagedObjectContext保存在SQLite方面做了什么?

时间:2013-12-04 22:14:23

标签: ios sqlite

我正在将一些iOS持久性功能移植到Android并尝试理解save(),以便在Android(纯SQLite)中复制功能。

文档说:

  

保存:   尝试将未保存的更改提交到已注册的对象到接收者的父存储。

没有多大帮助。

我知道iOS使用SQLite,因此必须以某种方式转换为SQLite。

看起来save是一个upsert - 如果还没有插入数据,否则会更新。

如果这是真的(如果不是,如果问题仍然有效) - 如何确定要更新哪一行?我没有看到如何在xcode中添加唯一的,所以如果我有例如:

id | name  | price    
1  | apple | 2.0    
2  | lemon | 1.0

“id”是内部行id,

我得到新的模型数据“lemon” - > 3.0,当我更新moc时,数据库如何知道它必须更新这一行?:

2  | lemon | 1.0

在SQlite中,我会在名称上添加一个唯一的,但我不知道它是如何在iOS中实现的。

我不是iOS开发者,对不起可能是超级特色或极端问题。

感谢。

3 个答案:

答案 0 :(得分:1)

我不知道以下情况是否属实,但我认为我并不遥远。

NSManagedObjectContext引用了使用SQLite数据库中的数据组成的对象(NSManagedObject)。这些对象都具有objectID属性,该属性是SQLite数据库中行的唯一标识符,允许您唯一地(甚至在上下文之间)标识对象/行。当您更改对象的属性时,这实际上不会更改数据库中的任何内容。上下文知道更改,当您调用save:时,它将转到数据库并更新所有记录。

这始终是UPDATE,因为您必须调用-[NSEntityDescription insertNewObjectForEntityForName:InManagedObjectContext]来获取对象的引用。此时,已插入一条记录,并为其提供objectID

答案 1 :(得分:1)

在数据库方面讨论核心数据真的很困难,因为它不是数据库。它使用一个来保存数据,但这就是它。

  

看起来save是一个upsert - 如果还没有插入数据,否则会更新。

NSManagedObjectContext不仅是一个对象(或数据库术语中的行)的当前状态,而是多个。因此,当您要求NSManagedObjectContext“保存”时,它会保存上下文中所有对象的状态。如果一个对象是新的,它将相当于一个插入。如果对象已存在,则它将等同于更新。但是,如果在某个时刻删除了一个对象,'save'方法也会从SQLite数据库中删除该对象。 'save'方法专门保存NSManagedObjectContext的状态。

  

如果这是真的(如果不是,如果问题仍然有效) - 怎么回事   确定要更新哪一行?我没有看到如何在xcode中添加唯一

这是因为Core Data处理对象的唯一标识。没有默认的“id”列来放置唯一标识符。但是,如果数据库将持久存储在许多设备上,您可以创建一个属性(即列/字段)来保存唯一标识符,我个人不得不一次这样做,因为'objectID'不实用。在Android中,除非您选择使用自动增量,否则您必须自己维护每行的唯一标识。

  

当我更新moc时,数据库如何知道它必须   更新这一行?

在某个时刻,您要求NSManagedObjectContext插入一个新的“实体”(即表格):

NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:managedObjectContext];

要更新实体,您可以使用以下方法检索它:

NSManagedObject *managedObject = [managedObjectContext objectWithID:managedObject.objectID];

进行任何调整,然后“保存”NSManagedObjectContext。 objectID是插入时自动分配的唯一标识符。 Core Data处理插入和更新行的样板代码,因此您最终会得到一个抽象版本,如示例所示。如果保存一些NSManagedObject并打开SQLite文件,您会发现它与任何其他数据库非常相似,而不是用于管理的一些核心数据特定字段。

我建议创建一个新的Master Detail Application项目,在模拟器中运行它,保存几个条目,然后打开SQLite文件。你可以在

中找到它
/Users/<username>/Library/Application Support/iPhone Simulator/<iOS Version>/Applications/<Application UDID>/Documents/

打开SQLite文件将向您显示数据库Core Data维护与任何其他SQLite数据库非常相似,并且可能有助于理解这些过程。

答案 2 :(得分:0)

NSManagedObjectContext是数据模型的一种表示。它来自名为CoreData的框架。通过使用CoreData,我们不直接操作SQLite数据库。这意味着我们不会编写任何SQL查询,我们只需在NSManagedObjectContext上执行所有更新,插入或删除操作。当我们调用save()时,NSManagedObjectContext将告诉数据库哪个行已更新,哪行被删除或插入了哪一行。这是另一个question,可以帮助您更多地了解NSManagedObjectContext