如何使用 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】:

您缺少的是SlickUserNewsFeedDataItem 之间的其他关系。您在 useritem 之间定义了一个 一对多 关系 - NewsFeedDataItem.owner -&gt; SlickUser - 以及该关系的反面 @987654328 @。

以下是我对您要达到的目标所做的假设:

ItemUser 拥有 [一对一] 一个Item可以被多个用户共享[一对多] 一个用户可以是多个项目的所有者[一对多] 一个用户可以共享许多项目 [一对多]

此处定义的内容代表您的 UserItem 之间的四 (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.userPostsUser 拥有的一组 ItemsSlickUser.sharedPostsUser 共享的一组 ItemsNewsFeedDataItem.ownerItem 的所有者。 NewsFeedDataItem.sharedBy 是一组共享 ItemUser

对于每个关系对 owner userPostssharedBy sharedPosts,您需要在托管对象上设置至少一侧的关系。 CoreData 将管理其余部分。

此解决方案是否满足您项目的需求?

【讨论】:

以上是关于如何使用 Objective-C 将一对多关系数据保存到核心数据中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 8 同时保存一对多关系数据

如何在核心数据中以一对多关系链接现有值?

如何使用PowerDesigner软件进行数据库设计(一对多关系)

在 Objective-C 中释放托管对象

如何使用使用存储库和一对多关系插入数据?

如何实现一对多关系