0

Core Data と Web サービスを使用しています。データをテーブルに追加したいのですが、どのように呼び出すべきかわかりません。この方法を使用すると機能しないため、助けてください。

これが私のHTTPクラスでデータベースを更新する方法です

- (void)updateLocalCardsDataBase:(NSArray*) cardsArray
{
    //check if current user has cards in local database
    NSManagedObjectContext* managedObjectContext = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];

    for(NSDictionary *cardDic in cardsArray)
    {
        Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:managedObjectContext];
        card.remote_id = [NSNumber numberWithInt:[[cardDic objectForKey:@"id"] intValue]];
        card.stampNumber = [NSNumber numberWithInt:[[cardDic objectForKey:@"stampNumber"] intValue]];
        card.createdAt = [NSDate dateWithTimeIntervalSince1970:[[cardDic objectForKey:@"createdAt"] intValue]];

        [managedObjectContext lock];
        NSError *error;
        if (![managedObjectContext save:&error])
        {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
            NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
            if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }
    [managedObjectContext unlock];
}

ここに私のテーブルがあります:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    // NSManagedObjectContext* managedObjectContext = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];
    static NSString *CellIdentifier = @"CardsCell";
    CardCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    
    if (cell == nil){
        NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CardCell" owner:nil options:nil];
    for (id currentObject in objects)
    {
        if([currentObject isKindOfClass:[UITableViewCell class]])
        {
            cell = (CardCell *) currentObject;
            break;
        }
    }

    NSDictionary *f = [_cards objectAtIndex:indexPath.row];

    cell.stampId.text = [f objectForKey:@"stampNumber"];
    NSLog(@"%@fdssfdfddavds",[f objectForKey:@"stampNumber"]);
    cell.createdAt.text = [f objectForKey:@"createdAt"];
    cell.CardId.text = [f objectForKey:@"id"];
    return cell;
}

編集:

私の問題は、データをどのように表示できるかですUITableView

4

1 に答える 1

0

を呼び出す前[tableView reloadData]に、最初にデータソースを取得する必要があります。ではなく、データモデルの配列が返されますNSDictionary。私の例のメソッド(またはあなたに最も適したバリエーション)をニーズに最も適した場所に配置できますが、これはモデルをフィルタリングまたはソートせず、すべてのモデルのみを取得します。また、テーブルビューを格納するViewControllerにメソッドを配置します。

-(NSArray*)getMycards {
    NSManagedObjectContext *context = [(AppDelegate*) [[UIApplication sharedApplication] delegate] managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Card" inManagedObjectContext:context]; 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    NSError *error;

    [request setEntity:entityDescription];

    NSArray *cards = [context executeFetchRequest:request error:&error];

    // now check if there is an error and handle it appropriatelty
    // I usually return 'nil' but you don't have if you don't want
    if ( error != nil ) {
        // investigate error
    }
    return cards;
}

テーブルを配置するViewControllerにプロパティを作成することをお勧めし@property NSArray *cardsます。これにより、管理が容易になります。私が行った1つの仮定(View Controllerに関する他の情報がないため、View Controllerのヘッダーファイル(@property UITableView *tableView;)で'tableView'という名前のプロパティが宣言されています。必要に応じて名前を調整してください。

上記の方法で、テーブルのデータをロードする前に配列にデータを入力する場合は、次のようにします。

// you put this block of code anywhere in the view controller that also has your table view
// likely in 'viewDidLoad' or 'viewDidAppear'
// and/or anywhere else where it makes sense to reload the table
self.cards = [self getMyCards];
if ( self.cards.count > 0 )
    [self.tableview reloadData];
else {
   // maybe display an error
}

今、あなたcellForRowAtIndexPathは次のように見えるはずです

-(UITableViewCell*tableView:tableView cellForRowAtIndexPath {
    UITbaleViewCell *cell = ...;
    // creating the type of cell seems fine to me
    .
    .
    .
    // keep in mind I don't know the exact make up of your card model
    // I don't know what the data types are, so you will have to adjust as necessary
    Card *card = self.cards[indexPath.row];

    cell.stampId.text = [[NSString alloc] initWithFormat:@"%@",card.stamp];
    cell.createdAt.text = [[NSString alloc] initWithFormat:@"%@",card.createdAt];
    // you might want format the date property better, this might end being a lot more than what you want
    cell.CardId.text = [[NSString alloc] initWithFormat:@"%@",card.id];

    return cell;
}

CoreDataは非常に強力です。CoreDataの概要に続いてCoreDataプログラミングガイドを強くお勧めします。

于 2013-03-05T15:48:54.710 に答える