Successfully reported this slideshow.
FMDB(SQLite用wrapperライブラリ)の利用方法
iOSアプリ開発メモ
http://i-yusuke.blogspot.jp/
はじめに
• SQLiteは、iOSで使用できるlocalデータベース
• FMDBは、SQLiteをobjective-cで利用しやすくする
ためのwrapperライブラリ
• ここでは、SQLiteとFMDBの利用準備から、簡単な
FMDB...
資料の概要
• 環境の準備
• データベースの作成
• SQLiteの利用(SELECT , INSERT , UPDATE ,
DELETE)
• 日時型について
http://i-yusuke.blogspot.jp/
環境の準備(1/3)
• SQLiteライブラリの追加
• xcodeプロジェクトのTARGETS > Build Phases > Link Binary With Librariesか
ら、「libsqlite3.0dylib」を追加。
•...
環境の準備(2/3)
• Litaのインストール
• GUIでDB設計及びデータ参照ができる。
• http://www.dehats.com/drupal/?q=node/58 からLitaとAdobe AIRをインスト
ール。
http:/...
環境の準備(3/3)
• FMDB使用クラスに以下をimportする
• #import FMDatabase.h
• #import FMDatabaseAdditions.h
http://i-yusuke.blogspot.jp/
データベースの作成(1/2)
• Litaにて「 .db」ファイルを生成する
• SQLiteで使用する代表的なデータ型
• TEXT , INTEGER , REAL , BOOL
• 日時型を使用する場合は、INTEGERを指定。詳細は後述...
データベースの作成(2/2)
http://i-yusuke.blogspot.jp/
SQLiteの利用(1/8)
• DB初期起動時のopen処理
• appの初回起動時は、Litaで生成したDBを読み込む。
• 2度目以降のopen処理
• 2度目以降は、FMDatabaseオブジェクトのopenメソッドを利用すれば良い。
...
//DBファイル名
static NSString* const DB_FILE = @"user.db";
//初期起動時のopen処理
- (BOOL)firstOpenDatabase {
//DBファイルへのパスを取得( /Documen...
SQLiteの利用(3/8)
• SELECT文
• 全レコードの参照
• SELECT カラム名, ... FROM テーブル名
• SELECT * FROM テーブル名
• 条件付き参照
• SELECT * FROM テーブル名 WHE...
SQLiteの利用(4/8)
//DBの全レコードを読み込み、インスタンスを配列に格納する。
-(void)selectAll{
[db open];
//クエリの実行と結果(ResultSet)の取得
FMResultSet *results...
//DBの全レコードを読み込み、インスタンスを配列に格納する。
-(void)selectRecord:(int)id{
[db open];
//クエリの実行と結果(ResultSet)の取得
FMResultSet *results = [...
SQLiteの利用(6/8)
• INSERT文
• INSERT INTO テーブル名 (カラム名, ... ) VALUES ( ? , ... )
//レコードの追加
-(void)insert:(NSString*)text day:(...
SQLiteの利用(7/8)
• UPDATE文
• UPDATE テーブル名 SET カラム名 = ? , ... WHERE 条件
//レコードの更新
-(void)update:(int)id text:(NSString*)text{
...
SQLiteの利用(8/8)
• DELETE文
• DELETE FROM テーブル名 WHERE 条件
//レコードの削除
-(void)delete:(int)id{
NSString* sql = @"DELETE FROM table...
日時型について(1/2)
• SQLiteでは、日時型の定義がない。
• 以下いずれかの型を使用、objective-cで変換する。
• INTEGER > UNIX時間(グレゴリオ暦 1970年1月1日を基準)
• REAL > ユリウス暦(...
日時型について(2/2)
//日本時間のNSDateを生成して、INSERTメソッドを呼び出し
[self insert:[NSDate dateWithTimeIntervalSinceNow:
[[NSTimeZone systemTime...
おわりに...
• 勉強させて頂いたブログ
• http://akabeko.me/blog/2011/11/ios-sqlite-fmdb/#fmdb_11
• http://selection9.blogspot.jp/2012/04/io...
Upcoming SlideShare
Loading in …5
×

FMDBの利用方法

6,026 views

Published on

iOSアプリの開発メモ
FMDB(SQLite用wrapperライブラリ)の利用方法

Published in: Technology, Education
  • Be the first to comment

FMDBの利用方法

  1. 1. FMDB(SQLite用wrapperライブラリ)の利用方法 iOSアプリ開発メモ http://i-yusuke.blogspot.jp/
  2. 2. はじめに • SQLiteは、iOSで使用できるlocalデータベース • FMDBは、SQLiteをobjective-cで利用しやすくする ためのwrapperライブラリ • ここでは、SQLiteとFMDBの利用準備から、簡単な FMDBの利用方法までを纏める http://i-yusuke.blogspot.jp/
  3. 3. 資料の概要 • 環境の準備 • データベースの作成 • SQLiteの利用(SELECT , INSERT , UPDATE , DELETE) • 日時型について http://i-yusuke.blogspot.jp/
  4. 4. 環境の準備(1/3) • SQLiteライブラリの追加 • xcodeプロジェクトのTARGETS > Build Phases > Link Binary With Librariesか ら、「libsqlite3.0dylib」を追加。 • FMDBライブラリの追加 • https://github.com/ccgus/fmdb からFMDBプロジェクトをダウンロードする。 • fmdb.m以外のファイルをxcodeプロジェクトにコピーする。(エラー回避) http://i-yusuke.blogspot.jp/
  5. 5. 環境の準備(2/3) • Litaのインストール • GUIでDB設計及びデータ参照ができる。 • http://www.dehats.com/drupal/?q=node/58 からLitaとAdobe AIRをインスト ール。 http://i-yusuke.blogspot.jp/
  6. 6. 環境の準備(3/3) • FMDB使用クラスに以下をimportする • #import FMDatabase.h • #import FMDatabaseAdditions.h http://i-yusuke.blogspot.jp/
  7. 7. データベースの作成(1/2) • Litaにて「 .db」ファイルを生成する • SQLiteで使用する代表的なデータ型 • TEXT , INTEGER , REAL , BOOL • 日時型を使用する場合は、INTEGERを指定。詳細は後述。 • 「 .db」をxcodeプロジェクトに追加する http://i-yusuke.blogspot.jp/
  8. 8. データベースの作成(2/2) http://i-yusuke.blogspot.jp/
  9. 9. SQLiteの利用(1/8) • DB初期起動時のopen処理 • appの初回起動時は、Litaで生成したDBを読み込む。 • 2度目以降のopen処理 • 2度目以降は、FMDatabaseオブジェクトのopenメソッドを利用すれば良い。 http://i-yusuke.blogspot.jp/
  10. 10. //DBファイル名 static NSString* const DB_FILE = @"user.db"; //初期起動時のopen処理 - (BOOL)firstOpenDatabase { //DBファイルへのパスを取得( /Documents/) NSString *dbPath = nil; NSArray *documentsPath = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); //取得データ数を確認 if ([documentsPath count] >= 1) { dbPath = [documentsPath objectAtIndex:0]; //パスの最後にファイル名をアペンドし、DBファイルへのフルパスを生成。 dbPath = [dbPath stringByAppendingPathComponent:DB_FILE]; } else { //error NSLog(@"search Document path error. database file open error."); return false; } //右側に続く→ //2度目以降のopen処理 [db open];  //DBファイルがDocument配下に存在するか判定 NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:dbPath]) { //デフォルトのDBファイルをコピー NSBundle *bundle = [NSBundle mainBundle]; NSString *orgPath = [bundle bundlePath]; //初期ファイルのパス。( /XXX.app/sample.db) orgPath = [orgPath stringByAppendingPathComponent:DB_FILE]; //デフォルトのDBファイルをDocument配下へコピー if (![fileManager copyItemAtPath:orgPath toPath:dbPath error:nil]) { NSLog(@"db file copy error. : %@ to %@.", orgPath, dbPath); return false; } } //open database with FMDB. db = [FMDatabase databaseWithPath:dbPath]; return [db open]; } ・アプリ初期起動時のopen処理 ・2度目以降のopen処理 SQLiteの利用(2/8) http://i-yusuke.blogspot.jp/
  11. 11. SQLiteの利用(3/8) • SELECT文 • 全レコードの参照 • SELECT カラム名, ... FROM テーブル名 • SELECT * FROM テーブル名 • 条件付き参照 • SELECT * FROM テーブル名 WHERE 条件 http://i-yusuke.blogspot.jp/
  12. 12. SQLiteの利用(4/8) //DBの全レコードを読み込み、インスタンスを配列に格納する。 -(void)selectAll{ [db open]; //クエリの実行と結果(ResultSet)の取得 FMResultSet *results = [db executeQuery:@"SELECT * FROM table"]; //recordオブジェクトを格納する配列を生成。要素0だが、mutableなので問題なし。 NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:0]; //レコード数分、取り出し処理を繰り返す while( [results next] ) { //レコード情報を格納するオブジェクト Record* record = [[Record alloc] init]; //カラム順に要素を取り出していく。 record.columnOfInteger = [results intForColumnIndex:0]; //取り出しが終わったら、arrayにrecordを格納する。 [array addObject:record]; } [db open]; } #import <Foundation/Foundation.h> //レコード情報を格納するクラス @interface Record : NSObject //id @property (nonatomic) int columnOfInteger; //その他カラムのプロパティを設定 @end ・SELECT文(全レコードの参照) ・レコード情報を格納するクラス http://i-yusuke.blogspot.jp/
  13. 13. //DBの全レコードを読み込み、インスタンスを配列に格納する。 -(void)selectRecord:(int)id{ [db open]; //クエリの実行と結果(ResultSet)の取得 FMResultSet *results = [db executeQuery:@"SELECT * FROM table WHERE id=?", [NSNumber numberWithInteger:id]]; //recordオブジェクトを格納する配列を生成。要素0だが、mutableなので問題なし。 NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:0]; //レコード数分、取り出し処理を繰り返す while( [results next] ) { //レコード情報を格納するオブジェクト Record* record = [[Record alloc] init]; //カラム順に要素を取り出していく。 record.columnOfInteger = [results intForColumnIndex:0]; //取り出しが終わったら、arrayにrecordを格納する。 [array addObject:record]; } [db open]; } ・SELECT文(条件付き参照) SQLiteの利用(5/8) *1 WHERE文で、id(主キー)が 一致した場合に参照する。 *2 SQLiteでは、int型を扱えないため、   idをNSNumber型に変換する。 http://i-yusuke.blogspot.jp/
  14. 14. SQLiteの利用(6/8) • INSERT文 • INSERT INTO テーブル名 (カラム名, ... ) VALUES ( ? , ... ) //レコードの追加 -(void)insert:(NSString*)text day:(NSDate*)day{ //insert文の雛型を作成 NSString *sql = @"INSERT INTO table (text,day) VALUES (?,?)"; [db open]; //変数を代入してクエリ発行 [db executeUpdate:sql,text,day]; [db close]; } http://i-yusuke.blogspot.jp/
  15. 15. SQLiteの利用(7/8) • UPDATE文 • UPDATE テーブル名 SET カラム名 = ? , ... WHERE 条件 //レコードの更新 -(void)update:(int)id text:(NSString*)text{ //update文の雛型を作成(id(主キー)が一致するレコードについて、値を更新 NSString *sql = @"UPDATE table SET text=? WHERE id=?"; [db open]; //変数を代入してクエリ発行 [db executeUpdate:sql,text,[NSNumber numberWithInteger:id]]; [db close]; } http://i-yusuke.blogspot.jp/
  16. 16. SQLiteの利用(8/8) • DELETE文 • DELETE FROM テーブル名 WHERE 条件 //レコードの削除 -(void)delete:(int)id{ NSString* sql = @"DELETE FROM table WHERE id = ?"; [db open]; [db executeUpdate:sql, [NSNumber numberWithInteger:id]]; [db close]; } http://i-yusuke.blogspot.jp/
  17. 17. 日時型について(1/2) • SQLiteでは、日時型の定義がない。 • 以下いずれかの型を使用、objective-cで変換する。 • INTEGER > UNIX時間(グレゴリオ暦 1970年1月1日を基準) • REAL > ユリウス暦(紀元前4713年 1月1日を基準) • TEXT > YYYY-MM-DD HH:MM:SS.SSS のフォーマット • SQLiteでは、内部的にUNIX時間が採用されているため、INTEGERを使用する。 http://i-yusuke.blogspot.jp/
  18. 18. 日時型について(2/2) //日本時間のNSDateを生成して、INSERTメソッドを呼び出し [self insert:[NSDate dateWithTimeIntervalSinceNow: [[NSTimeZone systemTimeZone] secondsFromGMT]]]; //INSERTメソッド -(void)insert:(NSDate*)day{ NSString *sql = @"INSERT INTO table (day) VALUES (?)"; [db open]; [db executeUpdate:sql,day]; [db close]; } //SELECTで読み込み -(void)select{ [db open]; FMResultSet *results = [db executeQuery:@"SELECT id,day FROM table"]; while( [results next] ) { Record* record = [[Record alloc] init]; record.columnOfInteger = [results intForColumnIndex:0]; record.columnOfDate = [results dateForColumnIndex:1]; [array addObject:record]; } [db open]; } #import <Foundation/Foundation.h> @interface Record : NSObject //id @property (nonatomic) int columnOfInteger; //日時(SQLiteでは、INTEGER型で格納される) @property (nonatomic) NSDate* columnOfDate; @end ・NSDate型(現在日時)の生成 ・INSERT文の発行 ・SELECT文で読み込み ・レコード格納クラスの定義 http://i-yusuke.blogspot.jp/
  19. 19. おわりに... • 勉強させて頂いたブログ • http://akabeko.me/blog/2011/11/ios-sqlite-fmdb/#fmdb_11 • http://selection9.blogspot.jp/2012/04/iossqlitefmdb.html http://i-yusuke.blogspot.jp/

×