菜鸟教程小白 发表于 2022-12-12 16:16:57

ios - Azure 移动服务 - 同步后重复项目


                                            <p><p>我使用 Azure 移动服务作为 iOS 应用程序的后端。我已将所有内容设置为使用离线同步,即使没有网络连接,我也可以查看、添加或修改数据。将新对象添加到表中时遇到问题。添加在本地运行良好,但是当我同步数据时,它会在本地数据库上创建一个重复的项目,其 objectId 略有不同。创建的项目在服务器端不重复。</p>

<p>这是我的设置方式。顺便说一句,感谢 @TheBasicMind 发布这个模型。
<a href="/image/vsd8p.png" rel="noreferrer noopener nofollow"><img src="/image/vsd8p.png" alt="enter image description here"/></a> </p>

<p>这是他对模型的解释的链接:<a href="https://stackoverflow.com/questions/24657437/core-data-background-context-best-practice" rel="noreferrer noopener nofollow">enter link description here</a> </p>

<p>这是我设置同步上下文和同步表的操作:</p>

<pre><code>    // Initialize the Mobile Service client with your URL and key
    MSClient *client = self.hpc.client;

    NSManagedObjectContext *context = self.hpc.syncContext;
    MSCoreDataStore *store = [ initWithManagedObjectContext:context];

    client.syncContext = [ initWithDelegate:syncDelegate dataSource:store callback:nil];

    // Add a Mobile Service filter to enable the busy indicator
    self.client = ;

    // Create an MSSyncTable instance to allow us to work with the Athlete table
    self.syncAthleteTable = ;
</code></pre>

<p>下面是我暂时添加记录的方法:</p>

<pre><code>NSDictionary *newItem = @{@&#34;firstname&#34;: firstname, @&#34;lastname&#34;: lastname, @&#34;laterality&#34; : laterality};

[self.athletesService addItem:newItem completion:^{

    NSLog(@&#34;New athlete added&#34;);
}];

-(void)addItem:(NSDictionary *)item completion:(CompletionBlock)completion
{
    // Insert the item into the Athlete table
    [self.syncAthleteTable insert:item completion:^(NSDictionary *result, NSError *error)
   {
         ;

         // Let the caller know that we finished
         dispatch_async(dispatch_get_main_queue(), ^{
             completion();
         });
   }];
}
</code></pre>

<p>添加按预期工作,它被添加到 UITableView 中,因为我有一个 NSFetchedResultsController 监听我的主上下文。 </p>

<p>这就是问题所在。当我使用此功能与服务器同步数据时:</p>

<pre><code>-(void)syncData:(CompletionBlock)completion
{

    // push all changes in the sync context, then pull new data
    [self.client.syncContext pushWithCompletion:^(NSError *error) {
      ;
      ;
    }];
}

-(void)pullData:(CompletionBlock)completion
{
   MSQuery *query = ;

    // Pulls data from the remote server into the local table.
    // We&#39;re pulling all items and filtering in the view
    // query ID is used for incremental sync
    [self.syncAthleteTable pullWithQuery:query queryId:@&#34;allAthletes&#34; completion:^(NSError *error) {
      ;
      ;

    }];
}

- (void) refreshDataOnSuccess:(CompletionBlock)completion
{
   MSQuery *query = ;

   [query readWithCompletion:^(MSQueryResult *results, NSError *error) {
         ;

         NSLog(@&#34;Data that pulled from local store: &#34;);
         for ( NSDictionary *dict in results.items ) {
            NSLog(@&#34;%@ %@&#34;, , );
      }

      // Let the caller know that we finished
      dispatch_async(dispatch_get_main_queue(), ^{
            completion();
      });
    }];
}
</code></pre>

<p>在同步之后,NSFetchedResultsChangeInsert 被第二次调用,用于具有稍微不同的 objectID 的相同记录。下面是第一个和第二个 objectID 的示例:
tD7ADE77E-0ED0-4055-BAF6-B6CF8A6960AE9<br/>
tD7ADE77E-0ED0-4055-BAF6-B6CF8A6960AE11<br/>
我被困在这里了。</p>

<p>非常感谢任何帮助。谢谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>过去,当我看到这种情况发生时,这是因为客户端发送的“id”字段被服务器逻辑更改或忽略了。 </p>

<p>商店在本地使用该字段在核心数据中查找对象,因此对其进行更改可能会导致客户端 SDK 认为它需要插入新对象而不是更新现有对象。</p>

<p>确认这一点的一种简单方法是使用数据委托(delegate)上的 tableOperation:complete: 方法,并比较最初的项目与操作执行返回的项目之间的“id”列。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Azure 移动服务 - 同步后重复项目,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32570006/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32570006/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Azure 移动服务 - 同步后重复项目