如何将唯一数据输入到核心数据值中?
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.bookMark
和 newBookMark
都是 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
设置为 imageLink
和 category
,那么您的结果将包括四项:
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
以下哪一项最能描述您想在抓取中获得的内容?
很抱歉回答很长。让我知道这些是否有帮助或无关紧要,我将相应地添加或修改答案。
我是 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.bookMark
和 newBookMark
都是 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
设置为 imageLink
和 category
,那么您的结果将包括四项:
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
以下哪一项最能描述您想在抓取中获得的内容?
很抱歉回答很长。让我知道这些是否有帮助或无关紧要,我将相应地添加或修改答案。