如何使用 Objective-C 将一对多关系数据保存到核心数据中
Posted
技术标签:
【中文标题】如何使用 Objective-C 将一对多关系数据保存到核心数据中【英文标题】:How to save one-many relationship data into core data using Objective-C 【发布时间】:2020-03-31 17:14:11 【问题描述】:我有一个 newsfeeditem,许多用户共享了这个 newsfeeditem。我需要为一个 newsfeedItem 保存许多用户。我有一个从 newsFeedItem 到 SlickUser 的一对多关系。 但我不知道如何将 SlickUser 数据保存或关联到 newsFeedItem。抱歉,我是核心数据的新手,我无法使用一对多关系保存数据。如果有人可以指导我如何使用 SlickOwner 将数据保存在 newsFeedItem
for(int i =0 ; i < posts.user.count ; i++)
SlickUser * user = posts.user[i];
if (self.contactdb)
[self.contactdb setValue:user.Aprovider forKey:@"Aprovider"];
[self.contactdb setValue:user.name forKey:@"name"];
[self.contactdb setValue:user.userid forKey:@"userid"];
else
NSManagedObject *newdevice = [NSEntityDescription insertNewObjectForEntityForName:@"SlickUser" inManagedObjectContext:context];
[newdevice setValue:user.Aprovider forKey:@"Aprovider"];
[newdevice setValue:user.name forKey:@"name"];
[newdevice setValue:user.userid forKey:@"userid"];
NSError *error = nil;
if (![context sa[here is the image for newsFeedItem ][1]ve:&error])
NSLog(@"can't save %@ %@", error, [error localizedDescription]);
这是 newsFeedItem 实体:
extension NewsFeedDataItem
@nonobjc public class func fetchRequest() -> NSFetchRequest<NewsFeedDataItem>
return NSFetchRequest<NewsFeedDataItem>(entityName: "NewsFeedDataItem")
@NSManaged public var aprovider: String?
@NSManaged public var lid: String?
@NSManaged public var owner: NSSet?
xtension NewsFeedDataItem
@objc(addOwnerObject:)
@NSManaged public func addToOwner(_ value: SlickUser)
@objc(removeOwnerObject:)
@NSManaged public func removeFromOwner(_ value: SlickUser)
@objc(addOwner:)
@NSManaged public func addToOwner(_ values: NSSet)
@objc(removeOwner:)
@NSManaged public func removeFromOwner(_ values: NSSet)
这是 UserSlick 实体:
extension SlickUser
@nonobjc public class func fetchRequest() -> NSFetchRequest<SlickUser>
return NSFetchRequest<SlickUser>(entityName: "SlickUser")
@NSManaged public var aprovider: Int64
@NSManaged public var userid: String?
@NSManaged public var userPic: String?
@NSManaged public var newsFeedPost: NewsFeedDataItem?
this is the screenshort for slickUser
【问题讨论】:
你能分享更多你的模型/实体是什么吗?屏幕截图没有提供足够的信息来提供帮助。听起来像这样设置了两个实体:“Feed 项目”有 1 个所有者和许多订阅者(两者都是“用户”类型)。在这种情况下,“用户”将与“供稿项目”具有 2 对多关系。一种关系是项目的所有者,一种关系是他们自己的订阅。对吗? @richardpiazza,我已经为 userSlick 和 NewsfeedItem 编辑了帖子并发布了实体。feedItem 只是拥有所有者,因为许多所有者可以共享同一个帖子。所以 owner 和 newsfeeditem 有一对多的关系 【参考方案1】:您缺少的是SlickUser
和NewsFeedDataItem
之间的其他关系。您在 user 和 item 之间定义了一个 一对多 关系 - NewsFeedDataItem.owner -> SlickUser
- 以及该关系的反面 @987654328 @。
以下是我对您要达到的目标所做的假设:
Item 由 User 拥有 [一对一] 一个Item可以被多个用户共享[一对多] 一个用户可以是多个项目的所有者[一对多] 一个用户可以共享许多项目 [一对多]此处定义的内容代表您的 User 和 Item 之间的四 (4) 种关系。
这是我如何配置所有内容的:
NewsFeedDataItem
import Foundation
import CoreData
@objc(NewsFeedDataItem)
public class NewsFeedDataItem: NSManagedObject
extension NewsFeedDataItem
@nonobjc public class func fetchRequest() -> NSFetchRequest<NewsFeedDataItem>
return NSFetchRequest<NewsFeedDataItem>(entityName: "NewsFeedDataItem")
@NSManaged public var aprovider: String?
@NSManaged public var lid: String?
@NSManaged public var owner: SlickUser?
@NSManaged public var sharedBy: NSSet?
// MARK: Generated accessors for sharedBy
extension NewsFeedDataItem
@objc(addSharedByObject:)
@NSManaged public func addToSharedBy(_ value: SlickUser)
@objc(removeSharedByObject:)
@NSManaged public func removeFromSharedBy(_ value: SlickUser)
@objc(addSharedBy:)
@NSManaged public func addToSharedBy(_ values: NSSet)
@objc(removeSharedBy:)
@NSManaged public func removeFromSharedBy(_ values: NSSet)
SlickUser
import Foundation
import CoreData
@objc(SlickUser)
public class SlickUser: NSManagedObject
extension SlickUser
@nonobjc public class func fetchRequest() -> NSFetchRequest<SlickUser>
return NSFetchRequest<SlickUser>(entityName: "SlickUser")
@NSManaged public var aprovider: Int64
@NSManaged public var userid: String?
@NSManaged public var userPic: String?
@NSManaged public var userPosts: NSSet?
@NSManaged public var sharedPosts: NSSet?
// MARK: Generated accessors for userPosts
extension SlickUser
@objc(addUserPostsObject:)
@NSManaged public func addToUserPosts(_ value: NewsFeedDataItem)
@objc(removeUserPostsObject:)
@NSManaged public func removeFromUserPosts(_ value: NewsFeedDataItem)
@objc(addUserPosts:)
@NSManaged public func addToUserPosts(_ values: NSSet)
@objc(removeUserPosts:)
@NSManaged public func removeFromUserPosts(_ values: NSSet)
// MARK: Generated accessors for sharedPosts
extension SlickUser
@objc(addSharedPostsObject:)
@NSManaged public func addToSharedPosts(_ value: NewsFeedDataItem)
@objc(removeSharedPostsObject:)
@NSManaged public func removeFromSharedPosts(_ value: NewsFeedDataItem)
@objc(addSharedPosts:)
@NSManaged public func addToSharedPosts(_ values: NSSet)
@objc(removeSharedPosts:)
@NSManaged public func removeFromSharedPosts(_ values: NSSet)
SlickUser.userPosts
是 User 拥有的一组 Items。
SlickUser.sharedPosts
是 User 共享的一组 Items。
NewsFeedDataItem.owner
是 Item 的所有者。
NewsFeedDataItem.sharedBy
是一组共享 Item 的 User。
对于每个关系对 owner userPosts 和 sharedBy sharedPosts,您需要在托管对象上设置至少一侧的关系。 CoreData 将管理其余部分。
此解决方案是否满足您项目的需求?
【讨论】:
以上是关于如何使用 Objective-C 将一对多关系数据保存到核心数据中的主要内容,如果未能解决你的问题,请参考以下文章