前回のコーディングで、位置情報を取得することができました。続いて位置情報をDBに格納しましょう。DBに格納せずに直接サーバに送り続けるということも考えられますが、扱いやすさを考えて一旦DBにいれます。
iOSではSQLiteを使うことが出来ます。使い方としては、Apple標準のCoreDataを使う方法の他に、SQLiteをラップしてくれるライブラリであるFMDBを使う方法もあります。どちらも一長一短があるので、自分の好みで選択すれば良いと思います。今回は勉強の意味も兼ねてCoreDataで書きます。
CoreDataを使ったサンプルコードは色々ありますが、次の3つくらいが参考になりそうです。
CoreDataBooks
iPhoneCoreDataRecipes
Locations
CoreDataBooksは、UITableViewをメインに書籍の登録・削除・一覧表示をするシンプルなアプリです。解りやすいので一度読んでおくと良いと思います。iPhoneCoreDataRecipesは結構複雑で、TableViewを使う上でのチップスが色々含まれています。Locationsは前回説明したもので、今回はデータ構造等はこれを参考にします。
またMVCモデルで作る場合は、木下誠さんの"iOS開発におけるパターンによるオートマティズム"が超絶に参考になります。iPhoneアプリを作る人は一度は読んでおくべきでしょう。
さて実際のコーディングです。今回はデータ操作はコントローラからではなく、モデルのマネージャークラスから行うようにします。まずフレームワークとして、CoreData.frameworkを追加します。次に2つのクラスを追加します。位置情報を定義するエンティティクラスであるLocationクラスを、NSManagedObjectのサブクラスとして作ります。CoreDataを扱うマネージャークラス。Modelsグループを追加して、その下に格納します。ついでにControllersグループを作って、前回作ったControllerもそちらに移動させます。またDataModelも追加しておきましょう。そうすると構成は次のようになります。
ソースは次のような感じです。
Location.h
#import <CoreData/CoreData.h>
@interface Location : NSManagedObject {
}
@property (nonatomic, retain) NSDate *creationDate;
@property (nonatomic, retain) NSNumber *latitude;
@property (nonatomic, retain) NSNumber *longitude;
@end
Location.m
#import "Location.h"
@implementation Location
@dynamic creationDate;
@dynamic latitude;
@dynamic longitude;
@end
DareTokuDataManager.h
#import <CoreData/CoreData.h>
@class Location;
@interface DareTokuDataManager : NSObject {
NSManagedObjectContext* _managedObjectContext;
}
@property (nonatomic, readonly) NSManagedObjectContext* managedObjectContext;
@property (nonatomic, readonly) NSArray* sortedLocations;
- (Location *)insertNewLocation;
- (void)save;
// 初期化
+ (DareTokuDataManager*)sharedManager;
@end
DareTokuDataManager.mについては、長いのでiOS開発におけるパターンによるオートマティズム片手にコーディングしてください。
そして前回作ったViewControllerに、DB保存機能を追加します。
//位置情報取得
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"didUpdateToLocation");
Location *location;
location = _location;
CLLocationCoordinate2D coordinate = [newLocation coordinate];
self.latitude.text = [[NSNumber numberWithDouble:coordinate.latitude] stringValue];
self.longitude.text = [[NSNumber numberWithDouble:coordinate.longitude] stringValue];
if (!location) {
location = [[DareTokuDataManager sharedManager] insertNewLocation];
}
[location setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];
[location setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];
[location setCreationDate:[newLocation timestamp]];
[[DareTokuDataManager sharedManager] save];
}
取得したデータの確認用に、一時的なテーブルビューを作りました。
またsqliteの実ファイルはDocumentsの部分に作られているので、info.plistで"Application supports iTunes file sharing"をYESにすれば、iTunesから扱えるようになります。
次回は取得したデータから地図で表示出来るようにしたいと思います。
enjoy!!
目次
iPhoneでカレログを作ろう その1 位置情報の取得
iPhoneでカレログを作ろう その2 DBへのデータ格納
iPhoneでカレログを作ろう その3 地図の表示
木下 誠
ビー・エヌ・エヌ新社
売り上げランキング: 45392