如何将唯一数据输入到核心数据值中?

How to Enter Unique Data In to Core Data Value?

我是 iOS 开发的新手。我只想在核心数据 Table 中为重复数据数组显示单个值。我知道这个问题被问过很多次,但我没有得到解决方案。请帮助我。

我创建了一个在一个视图中包含一个视图的应用程序,我创建了一个 HMSegmentedControll,在 HMSegmentedControll 中,我添加了 10 分段控件,每个分段控件都包含 UITable我想在用户时创建的视图Select 任何 UITableViewCell 然后它的数据也存储在核心数据中,它工作正常但总是添加相同的数据我想停止复制这个相同的数据数组。请给我解决方案

这是我的 UI 代码TableViewCell Selection 方法。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (self.bookMark)
{
    [self.bookMark setValue:cell.headLabel.text forKey:@"title"];
    [self.bookMark setValue:cell.categoryLabel.text forKey:@"category"];
    [self.bookMark setValue:cell.timeLabel.text forKey:@"post_date"];
    [self.bookMark setValue:image forKey:@"imagelink"];
    [self.bookMark setValue:post_id forKey:@"post_id"];
    [self.bookMark setValue:self.shortDiscription forKey:@"shortdescription"];
}
else
{
     newBookMark = [NSEntityDescription insertNewObjectForEntityForName:@"BookMark" inManagedObjectContext:context];
    [newBookMark setValue:cell.headLabel.text forKey:@"title"];
    [newBookMark setValue:cell.categoryLabel.text forKey:@"category"];
    [newBookMark setValue:cell.timeLabel.text forKey:@"post_date"];
    [newBookMark setValue:image forKey:@"imagelink"];
    [newBookMark setValue:post_id forKey:@"post_id"];
    [newBookMark setValue:self.shortDiscription forKey:@"shortdescription"];
}
NSError *error = nil;
if (![context save:&error])
{
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}

这里 self.bookMarknewBookMark 都是 NSManagedObject

并且我将获取请求的代码设为

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription  entityForName:@"BookMark" inManagedObjectContext:managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
NSError *error;
self.allreadArray = [managedObjectContext executeFetchRequest:request error:&error];

然后我设置 Here Dictionary 来获取数据,如

NSDictionary *entityProperties = [entity propertiesByName];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"post_id"]]];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"title"]]];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"shortdescription"]]];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"post_date"]]];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"category"]]];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"imagelink"]]];

这里我在表格视图单元格中显示获取数据为

-(CustumCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier=@"Cell";
CustumCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"CustumCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
[cell.spinner startAnimating];
[cell.headLabel setHighlightedTextColor:[UIColor grayColor]];
cell.viewLabel.hidden=TRUE;
NSManagedObject *device = [self.allreadArray objectAtIndex:indexPath.section];
NSString  *image=[device valueForKey:@"imagelink"];
if([image isKindOfClass:[NSString class]])
{
    [cell.cellImage sd_setImageWithURL:[NSURL URLWithString:[image stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] placeholderImage:[UIImage imageNamed:@"Setting.png"] options:SDWebImageProgressiveDownload completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
     {
         [cell.spinner stopAnimating];
         cell.spinner.hidesWhenStopped=YES;
     }];
}
cell.headLabel.text=[device valueForKey:@"title"];
cell.categoryLabel.text=[device valueForKey:@"category"];
cell.timeLabel.text=[device valueForKey:@"post_date"];
return cell;
}

然后总是获取@"imagelink"数据我想获取所有数据请给我解决方案 提前致谢。

您的问题可能出在很多地方。我将它们全部列出,希望其中之一对您有所帮助:

首先,在你的cellForRowAtIndexPath方法中,你有:

NSManagedObject *device = [self.allreadArray objectAtIndex:indexPath.section];

因此您使用 section 数字来确定您使用哪个 device 填充单元格。对于该部分中的每个单元格,这将是相同的 device。这可能是故意的(您可能需要多个部分,每个部分有一个单元格,而不是一个部分)。但是您可能意味着使用 row 数字来确定要使用哪个 device,这样每一行都是不同的。如果是这样,将上面的行替换为:

NSManagedObject *device = [self.allreadArray objectAtIndex:indexPath.row];

其次,在didSelectRowAtIndexPath方法中,将属性值保存到self.bookMark(如果存在)或新创建的Bookmark 对象。但是你没有在任何地方设置 self.bookMark 。因此,每次 select 一行,都会创建一个新对象。如果你真的想要 self.bookMark 引用那个新创建的书签对象,那么添加:

self.bookMark = newBookMark;

didSelectRowAtIndexPath 方法,在创建 newBookMark 后立即。因此,下次您 select 一行时,self.bookMark 将存在并且您将向其保存新值,而不是创建另一个(重复)对象。

第三,您的提取正在使用 setReturnsDistinctResults。使用它是不常见的,尽管它可能是您所需要的。但是,您使用该选项只是为了克服数据库中存在重复对象的问题吗?举个例子,假设您有四个具有以下属性的对象:

title    post_id    category    imageLink
Red      0001       Primary     pic1.jpg
Blue     0002       Primary     pic2.jpg
Green    0003       Secondary   pic1.jpg
Red      0004       Secondary   pic2.jpg

如果您使用 setReturnsDistinctResults 并将 setPropertiesToFetch 设置为 imageLink,则结果将仅包含两项:

imageLink
pic1.jpg
pic2.jpg

setPropertiesToFetch 设置为 imageLinkcategory,那么您的结果将包括四项:

category    imageLink
Primary     pic1.jpg
Primary     pic2.jpg
Secondary   pic1.jpg
Secondary   pic2.jpg

如果您真的想知道每个属性的不同值,那么您必须 运行 多次提取,并且每次都更改 propertiesToFetch:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
NSError *error;
NSDictionary *entityProperties = [entity propertiesByName];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"post_id"]]];
self.postIdArray = [managedObjectContext executeFetchRequest:request error:&error];
[request setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"title"]]];
self.titleArray = [managedObjectContext executeFetchRequest:request error:&error];
etc, etc.

这将产生两个数组,postIdArray 有四个项目:

post_id
0001
0002
0003
0004

和具有三个项目的 titleArray:

title
Red
Blue
Green

以下哪一项最能描述您想在抓取中获得的内容?

很抱歉回答很长。让我知道这些是否有帮助或无关紧要,我将相应地添加或修改答案。