プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iPhoneでカレログを作ろう その2 DBへのデータ格納

 前回のコーディングで、位置情報を取得することができました。続いて位置情報を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 地図の表示

iOS開発におけるパターンによるオートマティズム
木下 誠
ビー・エヌ・エヌ新社
売り上げランキング: 45392