スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

[iOS]CoreDataチュートリアル(CoreDataのイベント追加)

○もくじ○
[iOS]CoreDataチュートリアル(土台編)
[iOS]CoreDataチュートリアル(CoreDataの作成)
[iOS]CoreDataチュートリアル(CoreDataのイベント追加) <- 現在
[iOS]CoreDataチュートリアル(CoreDataのイベントフェッチ)
[iOS]CoreDataチュートリアル(CoreDataのイベント削除)

この回では、CoreDataを操作するためのイベントの追加を行います。
CoreData~Tutorial~ 仕切り用画像


●addEventメソッドの宣言を "RootViewController.h" へ追加します。
//プロパティ宣言後くらいに追加する
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) UIBarButtonItem *addButton;
- (void)addEvent;
@end


●addEventメソッドを "RootViewController.m" へ実装します。
//Eventオブジェクトを作成した位置を取得する。
- (void)addEvent {
CLLocation *location = [locationManager location];
if (!location) {
//取得できなければ、処理を中断する。
return;
}
// Eventエンティティの新規インスタンスを作成して設定する
Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:managedObjectContext];
CLLocationCoordinate2D coordinate = [location coordinate];
//現在の位置情報をeventインスタンスへ格納する。(この段階ではまだ永久ストアへの反映は行われません。)
[event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];
[event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];
//シュミレータでは日付が固定のため、代わりに現在時刻を取得して格納する。
[event setCreationDate:[NSDate date]];
NSError *error = nil;
if (![managedObjectContext save:&error]) { //ここで明示的に永久ストアへのプッシュを行います。
// エラーを処理する
}
//最新Eventが配列の最初に来るようにスタックの仕組みを作る
//また、Eventが追加されるたび、テーブルにデータを挿入します。
[eventsArray insertObject:event atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
//データ追加後、テーブルビューを一番上のデータまでスクロールする
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
atScrollPosition:UITableViewScrollPositionTop animated:YES];
}


●最後にテーブルに表示するためのメソッドと仕組みを実装します。
この実装は、データ管理ではなく、表示に関連した実装になります。
//格納したイベント分だけ、テーブル行を生成する。
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [eventsArray count];
}

//
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// タイムスタンプ用の日付フォーマッタ
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}
// 緯度と経度用の数値フォーマッタ
static NSNumberFormatter *numberFormatter = nil;
if (numberFormatter == nil) {
numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:3];
}

static NSString *CellIdentifier = @"Cell";
// 新規セルをデキューまたは作成する
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
Event *event = (Event *)[eventsArray objectAtIndex:indexPath.row];
cell.textLabel.text = [dateFormatter stringFromDate:[event creationDate]];
NSString *string = [NSString stringWithFormat:@"%@, %@",
[numberFormatter stringFromNumber:[event latitude]],
[numberFormatter stringFromNumber:[event longitude]]];
cell.detailTextLabel.text = string;
return cell;
}


▲ここで一度ビルドチェック▲
実行時、addボタンを動作させる以外であれば正常に動作するはずです。

注意:ここでもし下記のようなエラーが発生する場合

2011-02-15 10:04:16.087 CoreDataMigrationTest[471:207]
Unresolved error Error Domain=NSCocoaErrorDomain Code=134100
"The operation couldn’t be completed. (Cocoa error 134100.)"
UserInfo=0x5846b90 {metadata={type = immutable dict, count = 6,
entries =>



このエラーの対処法はシュミレータのビルド時に吐き出されたアプリケーションを削除することで解消するようです。
また、このようなことが起きないような対策が載っているサイトを下記に乗せておきます。
参考URL:Core Dataの自動マイグレーション

ここまで行きましたら次へ進みます。


次回:[iOS]CoreDataチュートリアル(CoreDataのイベントフェッチ)
このエントリーをはてなブックマークに追加

tag : iOS プログラミングガイド

コメントの投稿

非公開コメント

Translation


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
プロフィール

チーズくん

Author:チーズくん
個人的メモをただ羅列しています。
twitter:@cheese1038

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。