OStack程序员社区-中国程序员成长平台

标题: ios - 如何将唯一数据输入核心数据值? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 04:43
标题: ios - 如何将唯一数据输入核心数据值?

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

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

这是我的 UITableViewCell 选择方法的代码。

-(void)tableViewUITableView *)tableView didSelectRowAtIndexPathNSIndexPath *)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 来获取像 as 一样的数据

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"]]];

在这里,我在 tableview 单元格中显示 Fetch Data

-(CustumCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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”数据我想获取所有数据请给我解决方案 提前致谢。



Best Answer-推荐答案


您的问题可能存在很多地方。我会把它们都列出来,希望其中一个能有所帮助:

首先,在您的 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 。因此,每次选择一行时,都会创建一个新对象。如果您确实希望 self.bookMark 引用该新创建的书签对象,请添加:

self.bookMark = newBookMark;

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

第三,您的 fetch 使用的是 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

如果你真的想知道每个属性的不同值,那么你必须多次运行 fetch,并且每次都更改 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

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

抱歉,回答太长了。让我知道这是否有帮助或不相关,我会相应地添加或修改答案。

关于ios - 如何将唯一数据输入核心数据值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27855180/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4