2009年9月30日水曜日

CoreData - テーブルの件数を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
(前回からの続き:Cocoa Touch の日々: CoreDataを使う

これから CoreData のデータを UITableView へ表示させる。UITableView へデータを表示するには最低2つの DataSourceメソッドを実装する必要がある。
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;


これらのメソッドを実装するにあたり、まずはテーブルの件数を取得しよう。

ネットで探してみると "Effecient way to count entities" という記事が見つかった。
(参考)Cocoa CoreData effiecient way to count entities! - Stack Overflow

これを参考に件数取得のコードを書いてみた(というかそのまんまだが)。

- (NSUInteger)getCount
{
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Memo"
inManagedObjectContext:managedObjectContext]];
[request setIncludesSubentities:NO];

NSError* error = nil;
NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];
if (count == NSNotFound) {
count = 0;
}
[request release];

return count;
}


managedObjectContext はメンバ変数として既に用意してあるものとする。
#NSError 変数は以前痛い目にあっているので必ず初期化しておく。



もし条件で絞り込みたい場合は Predicateなどが使える。
(参考)Cocoaの日々 - 2005年10月

2009年9月2日水曜日

CoreDataを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iPhone3.0から CoreData が使えるとのことだったので OneLiner で使ってみることにする。CoreDataは随分昔に MacOSXで使ったことがあるのでそのときの記事を引っ張りだしてきてコードを書いてみた。

Cocoaの日々(旧)
Core Data その1

CoreDataは永続性スタックと呼ばれるいくつかのクラスで構成されていて、利用時にはこれらのインスタンスを用意する必要がある。

(過去記事から引用)


コードはこんな感じ(とりあえず awakeFromNib に書いてみた)。
- (void)awakeFromNib
{
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];

managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];

NSError* error = nil;
NSString* filepath = [NSString stringWithFormat:@"%@/%@",
[NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],
@"memo.db"];

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL fileURLWithPath:filepath]
options:nil
error:&error];
NSLog(@"1:%@", error);

NSManagedObject* memo =
[NSEntityDescription insertNewObjectForEntityForName:@"Memo"
inManagedObjectContext:managedObjectContext];
[memo setValue:@"hello" forKey:@"title"];
[memo setValue:@"photo1.png" forKey:@"photo"];
[managedObjectContext save:&error];
NSLog(@"2:%@", error);
}


永続性スタックである NSPersistentStoreCoordinator, NSManagedObjectContext を用意し、必要な処理を加えていけば良い。以前の記事でも解説されているが、前者はモデル(いわゆるスキーマ)と(persistent object storeを通じて)DBファイルを扱い、後者はDBに対する検索、追加、変更、削除などのプログラミングのインターフェイスを提供している。今回永続化タイプは SQLite を選んだ。

モデルは Xcodeの「新規ファイル...」から作成できる。


今回は Memo というエンティティを1つ用意した。


さて実行してみよう。所定の場所に memo.db が作成されて(サンプルコードで挿入した)値が格納されているのがわかる。

2009年9月1日火曜日

Snow Leopard 付属の Xcode3.2 アップグレードすると iPhone開発ができなくなった

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Snow Leopard 付属の Xcode3.2 アップグレードすると iPhone開発ができなくなった。iPhoneを接続してもオーガナイザになにも表示されない。

ネットを調べると Snow Leopard用の iPhone SDK が出ているとこのことだった。

iPhone Dev Center(要ログイン) へログインし、Downloadsから "iPhone SDK (Snow Leopard)" を選びダウンロードしインストールする。

すると iPhoneが認識され、無事にビルドすることができた。

- - - -

XCode3.2 ではフォントが変わった。