我是xcode的新手,因此是Objective-c。现在写我的第一个应用程序,呜呜! :-)该应用程序应该是一本字典。我在写入核心数据sqlite数据库中的字段时遇到问题。我的表叫做WordDict,字段是; aNum(string),bLetter(string),cCategory(string),dWord(string),eEnglish(string)和fFav(BOOL)。
我能够将数据读入pickerView控件,并在textView中显示与pickerView中的行对应的信息。但是,我希望一旦一个单词及其含义分别在pickerView和textView中,我可以单击一个按钮,(btnAddToFav),BOOL YES将更新到pickerView中显示的当前记录的fFav字段
我尝试了一些事情,但不知道如何将fFav的当前字段的值从fetchedResultController传递给更新字段的按钮操作。
我尝试了一些使程序崩溃几次并出现一些错误的事情:coredata error(19)主键必须是其他常用键的唯一键,例如:NSSQLiteErrorDomain = 19.
我在我的智慧结束,而不是我有很多开始:-)。以下是我的一些代码:
#import "SMPWPCDetailsVC.h"
@interface SMPWPCDetailsVC ()
{
int count;
}
@end
@implementation SMPWPCDetailsVC
@synthesize fetchedResultsController = _fetchedResultsController;
@synthesize forFavToUpdate = _forFavToUpdate;
@synthesize forFavWord = _forFavWord;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
-(void)letterCheck: (int) numValue{
if ([self.fetchedResultsController fetchedObjects].count <= numValue) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:_lblCategoryText message:@"The letter chosen does not have entries that fit the above category." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}else{
WordDict *slang = [[self.fetchedResultsController fetchedObjects] objectAtIndex:numValue];
_txtMeaning.text = slang.eEnglish;
_forFavWord = slang.dWord;
_forFavToUpdate = slang.fFav;
count = (int) slang.aNum;
}
}
-(void)viewWillAppear:(BOOL)animated{
[self letterCheck:0];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
_lblLetter.text = _lblLetterText;
//Passes the managedObjectContext along from the AppDelegate
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
NSError *error = nil;
if (![[self fetchedResultsController]performFetch:&error]) {
// Handle the error
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error!" message:@"For some reason there was a problem connecting to the database. Please restart the app and try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
#pragma mark -
#pragma mark PickerView Controls section
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return [[self.fetchedResultsController fetchedObjects] count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
// Display the Words we've fetched on the picker
WordDict *slang = [[self.fetchedResultsController fetchedObjects] objectAtIndex:row];
return slang.dWord;
//Another way to do it -- return [[[self.fetchedResultsController fetchedObjects] objectAtIndex:row]valueForKey:@"dWord"];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[self letterCheck:(int)row];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel *tView = (UILabel *)view;
if (!tView){
tView = [[UILabel alloc] init];
// Setup label properties - frame, font, colors etc
tView.font = [UIFont boldSystemFontOfSize:18];
tView.adjustsFontSizeToFitWidth = YES;
tView.textAlignment = NSTextAlignmentCenter;
}
// Fill the label text here
[tView setText:[[[self.fetchedResultsController fetchedObjects] objectAtIndex:row]valueForKey:@"dWord"]];
return tView;
}
#pragma mark -
#pragma mark Fetched Results Controller section
-(NSFetchedResultsController *) fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WordDict"
inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cCategory == %@ AND bLetter == %@",_lblCategoryText,_lblLetterText];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dWord"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:@"bLetter" cacheName:nil];
return _fetchedResultsController;
}
- (IBAction)btnBack:(UIButton *)sender {
}
- (IBAction)btnHome:(UIButton *)sender {
}
-(void) addToFav: (int) favValue{
WordDict * addFav = [[self.fetchedResultsController fetchedObjects] objectAtIndex:favValue];
addFav.fFav = [NSNumber numberWithBool:YES];
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
- (IBAction)btnAddToFavs:(UIButton *)sender {
[self addToFav:count];
}
@end
任何想法??
感谢您提供任何帮助。
此致 Socaprice
好的,我让这个工作了。我添加了以下代码:
-(void) addToFav:favCriteria{
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"WordDict" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"aNum == %@",favCriteria];
[fetchRequest setPredicate:predicate];
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if([fetchedObjects count] > 0)
{
WordDict *slangObj = [fetchedObjects objectAtIndex:0];
slangObj.fFav = [NSNumber numberWithBool:YES];
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// Handle the error
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error!" message:@"For some reason there was a problem connecting to the database. Please restart the app and try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
- (IBAction)btnAddToFavs:(UIButton *)sender {
[self addToFav: _forRecToUpdate];
}
我在第一个代码部分更改了一个值:
_txtMeaning.text = slang.eEnglish;
_forFavWord = slang.dWord;
_forFavToUpdate = slang.fFav;
count = (int) slang.aNum;
为:
_txtMeaning.text = slang.eEnglish;
_forRecToUpdate = slang.aNum;
这是有效的,因为我首先必须获得数据库中唯一字段的值,然后找到该标准。这允许我更改数据库中字段的值。
现在我唯一的问题是如何刷新选择器控件。但那是另一个问题......: - )
感谢大家的帮助。