菜鸟教程小白 发表于 2022-12-13 15:49:55

iOS:关注系统的核心数据架构


                                            <p><p>我在 mysql 和 php 中有一个跟踪系统,它只使用一个表,如下所示:</p>

<p>关注</p>

<p>id|userid|followerid</p>

<p>(还有一个users表:id|username|pass)</p>

<p>每当用户关注另一个用户时,都会在关注列中使用 followerid 并在 userid 列中使用被关注的人进行条目。</p>

<p>我现在正尝试使用 Web 服务从 iOS 应用程序访问它。</p>

<p>对于 VC,我希望能够列出用户,但通过链接 NSPredicate 在用户的关注者和用户关注的人之间切换。这对于使用 php/sql 来说是微不足道的,但在转换为 CoreData 时需要花费一些时间。</p>

<p>现在我在核心数据中有用户实体,具有以下属性:</p>

<p>id|用户名|密码</p>

<p>并复制 mysql 架构,我还有一个以下实体
fid|fuserid|flowerid </p>

<p>反过来,我为用户与关注者创建了一对多关系,并为用户与关注者创建了反向一对多关系,因为给定用户(例如应用程序的用户)可以有很多关注者,也可以关注很多人。</p>

<p>Web 服务当前设置为向用户和每个用户提供一组关注者 ID,如下所示
编号:1
名称:鲍勃
追随者:2,3,4</p>

<p>此时我被难住了。我可以填充用户实体。我还可以用所有关注用户的人和用户关注的人填充关注者实体。</p>

<p>但是,我不知道要向 Core data 传达哪些关注者与哪个用户相关,而且我也不知道如何编写谓词,例如,仅拉取应用程序用户的关注者。 </p>

<p>希望有任何建议。</p>

<p>现在我的 NSManagedObjects 如下所示:</p>

<pre><code>   //User.h
    #import &#34;Following.h&#34;
    @class Following;

    @interface User : NSManagedObject
    //in user entity
    @property (nonatomic, retain) NSNumber * uid;
    @property (nonatomic, retain) NSString * uname;
    @property (nonatomic, retain) NSString *upass;

    //this is relationship
    @property (nonatomic, retain) Following *following;

    @end

//and Following.h   
   #import &#34;User.h&#34;
    @class User;

    @interface Following : NSManagedObject

    @property (nonatomic, retain) NSNumber * fid;
    @property (nonatomic, retain) NSNumber * fuserid;
    @property (nonatomic, retain) NSNumber * followerid;
    //this is relationship
    @property (nonatomic) User *user;

    @end
</code></pre>

<p>从网络服务导入和保存用户后,我尝试在关注实体中保存一些关于关注者的信息,但不确定我在这里做什么......</p>

<pre><code> NSSet*followerids = importUser.followerids;
                  NSInteger *folnum =;
                  if (folnum&gt;0) {
                  for (id item in followerids) {
                        Following *newFollowing = ;
                        newFollowing.fuserid = useridnum;
                         NSNumber *itemnum = ];
                        newFollowing.followerid = itemnum;
                        newFollowing.user = record;//where record is a user just created   
                  }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你实际上有一个多对多的关系(每个 <code>User</code> 可以跟随许多其他 <code>Users</code>,并且可以跟随许多 <code>Users</code>)。您可以通过 <em>two</em> 对多关系,<code>followedByUsers</code> 和 <code>usersBeingFollowed</code> 直接在 CoreData 中对此进行建模,而无需创建额外的实体,其中一个是另一个的倒数。生成的模型如下所示:</p>

<p> <a href="/image/oXH3f.png" rel="noreferrer noopener nofollow"><img src="/image/oXH3f.png" alt="DataModel"/></a> </p>

<p>您的 <code>User</code> 类定义将如下所示:</p>

<pre><code>@interface User : NSManagedObject
//in user entity
@property (nonatomic, retain) NSNumber *uid;
@property (nonatomic, retain) NSString *uname;
@property (nonatomic, retain) NSString *upass;

//this is relationship
@property (nonatomic, retain) NSSet *followedByUsers;
@property (nonatomic, retain) NSSet *usersBeingFollowed;

@end
</code></pre>

<p>如果您的 Web 服务提供 <code>userid</code>、<code>name</code> 和一组 <code>followerids</code>,我将首先创建所有 <code>用户</code>,不设置任何关系,然后通过获取<code>followerids</code>对应的<code>User</code>记录来循环建立关系:</p>

<pre><code>NSPredicate *userPredicate = ;
NSFetchRequest *fetchUser = ;
fetchUser.predicate = userPredicate;
NSArray *results = ;
User *record = results;
NSSet *followerids = importUser.followerids;
NSInteger folnum =;
if (folnum&gt;0) {
    NSPredicate *predicate = ;
    NSFetchRequest *fetch = ;
    fetch.predicate = predicate;
    NSArray *resultsArray = ;
    if ( &gt; 0) {
      NSSet *followers = ;
      record.followedByUsers = followers;
    }
}
</code></pre>

<p>(为简单起见,我省略了通常的错误检查。)建立关系后,您可以确定哪些用户关注给定用户:</p>

<pre><code>givenUser.followedByUsers
</code></pre>

<p>或者,如果您想使用谓词(例如,对于 fetchedResultsController),请使用:</p>

<pre><code>NSPredicate *predicate = ;
</code></pre>

<p>相反,要获取 <code>givenUser</code> 正在关注的用户,请使用</p>

<pre><code>givenUser.usersBeingFollowed
</code></pre>

<p>或</p>

<pre><code>NSPredicate *predicate = ;
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iOS:关注系统的核心数据架构,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36438703/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36438703/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS:关注系统的核心数据架构