• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
FMDBの利用方法
 

FMDBの利用方法

on

  • 3,932 views

iOSアプリの開発メモ

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

Statistics

Views

Total Views
3,932
Views on SlideShare
3,630
Embed Views
302

Actions

Likes
4
Downloads
8
Comments
0

7 Embeds 302

http://i-yusuke.blogspot.jp 256
http://i-yusuke.blogspot.com 40
https://twitter.com 2
http://i-yusuke.blogspot.tw 1
http://cc.bingj.com 1
http://i-yusuke.blogspot.de 1
https://cybozulive.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    FMDBの利用方法 FMDBの利用方法 Presentation Transcript

    • FMDB(SQLite用wrapperライブラリ)の利用方法 iOSアプリ開発メモ http://i-yusuke.blogspot.jp/
    • はじめに • SQLiteは、iOSで使用できるlocalデータベース • FMDBは、SQLiteをobjective-cで利用しやすくする ためのwrapperライブラリ • ここでは、SQLiteとFMDBの利用準備から、簡単な FMDBの利用方法までを纏める http://i-yusuke.blogspot.jp/
    • 資料の概要 • 環境の準備 • データベースの作成 • SQLiteの利用(SELECT , INSERT , UPDATE , DELETE) • 日時型について http://i-yusuke.blogspot.jp/
    • 環境の準備(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/
    • 環境の準備(2/3) • Litaのインストール • GUIでDB設計及びデータ参照ができる。 • http://www.dehats.com/drupal/?q=node/58 からLitaとAdobe AIRをインスト ール。 http://i-yusuke.blogspot.jp/
    • 環境の準備(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を指定。詳細は後述。 • 「 .db」をxcodeプロジェクトに追加する http://i-yusuke.blogspot.jp/
    • データベースの作成(2/2) http://i-yusuke.blogspot.jp/
    • SQLiteの利用(1/8) • DB初期起動時のopen処理 • appの初回起動時は、Litaで生成したDBを読み込む。 • 2度目以降のopen処理 • 2度目以降は、FMDatabaseオブジェクトのopenメソッドを利用すれば良い。 http://i-yusuke.blogspot.jp/
    • //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/
    • SQLiteの利用(3/8) • SELECT文 • 全レコードの参照 • SELECT カラム名, ... FROM テーブル名 • SELECT * FROM テーブル名 • 条件付き参照 • SELECT * FROM テーブル名 WHERE 条件 http://i-yusuke.blogspot.jp/
    • 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/
    • //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/
    • 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/
    • 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/
    • 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/
    • 日時型について(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/
    • 日時型について(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/
    • おわりに... • 勉強させて頂いたブログ • http://akabeko.me/blog/2011/11/ios-sqlite-fmdb/#fmdb_11 • http://selection9.blogspot.jp/2012/04/iossqlitefmdb.html http://i-yusuke.blogspot.jp/