我正在将一些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开发者,对不起可能是超级特色或极端问题。
感谢。
答案 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
。