【iOS機能実現】の:FMBBを使ってSQLiteに接続する

20978 ワード

前言
http://blog.devtang.com/blog/2012/04/22/use-fmdb/
SQLite(http://www.sqlite.org/docs.html)は軽量級の関係データベースです.iOS SDKは早くからSQLiteをサポートしていますが、使う時はlibsqlite 3.dylib依存とsqlite 3.hヘッダファイルの導入だけでいいです.しかし、元のSQLite APIは使用上はかなり友好的ではなく、使用時には非常に不便です.したがって、オープンソースコミュニティにはSQLite APIをパッケージ化する一連のライブラリが出現し、FMB(SQLite API)は、https://github.com/ccgus/fmdb)はコミュニティの中の優秀者です.
FMBBは使用にとても便利です.以下は簡単な例です.
1
2
3
4
5
6
7
8
9
10
11
NSString* docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString* dbpath = [docsdir stringByAppendingPathComponent:@"user.sqlite"]; FMDatabase* db = [FMDatabase databaseWithPath:dbpath]; [db open]; FMResultSet *rs = [db executeQuery:@"select * from people"]; while ([rs next]) {  NSLog(@"%@ %@",  [rs stringForColumn:@"firstname"],  [rs stringForColumn:@"lastname"]); } [db close]; 
FMBBを使用した後のデータベースコードは明らかで、元のAPIよりずっと優雅です.また、FMDBはARCと非ARCの両方に対応しており、工程構成に応じてメモリ管理コードを自動的に調整しています.
使用説明
この使用説明書は主にfmdbのgithubプロジェクト説明書から翻訳します. https://github.com/ccgus/fmdb
関連ファイルをインポート
まずFMDBをgithubからcloneして、次のファイルのcopyをあなたのプロジェクトに送ります.
1
2
3
4
5
6
7
8
9
10
FMDatabase.h FMDatabase.m FMDatabaseAdditions.h FMDatabaseAdditions.m FMDatabasePool.h FMDatabasePool.m FMDatabaseQueue.h FMDatabaseQueue.m FMResultSet.h FMResultSet.m 
データベースを作成
データベースを作成するには、次の行だけでいいです.ファイルが存在しない場合、fmdbは自分で作成します.もしあなたが入ってきたパラメータが空の列であれば、fmdbは一時ファイルディレクトリの下でこのデータベースを作成します.もしあなたが入ってきたパラメータがNULLであれば、メモリ内のデータベースを構築します.
1
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
データベースを開く
次のような文を使います.もし開けられなかったら、権限が足りなかったり、リソースが足りなかったりするかもしれません.通常の操作が完了すると、クローズドメソッドを呼び出してデータベースを閉じる必要があります.
1
2
3
4
5
6
7
8
if (![db open]) {  // error   return; } // some operation // ...  [db close]; 
更新操作を実行
Select操作以外は更新操作です.更新操作には以下の方法があります.エラーがあったら、errorパラメータで取得できます.
1
-[FMDatabase executeUpdate:error:withArgumentsInArray:orVAList:]
クエリー操作を実行
クエリーの操作例は以下の通りです.操作結果が1行であっても、FMreesult Setのnextメソッドを呼び出す必要があります.
1
2
3
4
5
6
7
8
9
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"]; while ([s next]) {  //retrieve values for each record }  FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"]; if ([s next]) {  int totalCount = [s intForColumnIndex:0]; } 
FMBBは、異なるタイプのデータを取得するための複数の方法を提供する.
1
2
3
4
5
6
7
8
9
10
11
intForColumn: longForColumn: longLongIntForColumn: boolForColumn: doubleForColumn: stringForColumn: dateForColumn: dataForColumn: dataNoCopyForColumn: UTF8StringForColumnIndex: objectForColumn: 
通常はFMRI esult Setを閉じる必要はありません.関連するデータベースがオフになるとFMrsesult Setも自動的にオフになります.
データパラメータ
通常の状況では、SQLの標準文を使ってもいいですか?ステートメントを実行するパラメータを表します.
1
INSERT INTO myTable VALUES (?, ?, ?)
その後、我々はexecuteUpdate方法を呼び出すことができますか?具体的なパラメーターが入ってくると、通常は変長パラメータで伝えられます.
1
2
NSString *sql = @"insert into User (name, password) values (?, ?)"; [db executeUpdate:sql, user.name, user.password]; 
ここで注意したいのは、パラメータはNSObjectのサブクラスである必要がありますので、int、double、bookという基本的なタイプは、対応するパッケージ類にカプセル化する必要があります.
1
2
3
4
//   ,42       [db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42]; //   , 42    NSNumber   [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]]; 
スレッドの安全
もし私たちのアプリがマルチスレッドのオペレーティングデータベースを必要とするなら、FMDataseQueを使ってスレッドの安全を保証する必要があります.複数のスレッドで同じFMDatabaseオブジェクトを同時に使用することはできません.このクラス自体はスレッドの安全ではありません.このように使うとデータが混乱するなどの問題があります.
FMDathabaseQueを使うのは簡単です.まず一つのデータベースファイルのアドレスを使って、FMDathabaseQueを初めて使用して、一つのクローズドをinDatabase方法に導入することができます.クローズド中でデータベースを操作して、直接FMDabrateの管理に参加しません.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//   ,            FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];  //    [queue inDatabase:^(FMDatabase *db) {  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];   FMResultSet *rs = [db executeQuery:@"select * from foo"];  while ([rs next]) {  // …  } }];  //         [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];   if (whoopsSomethingWrongHappened) {  *rollback = YES;  return;  }  // etc…  [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]]; }]; 
ツール
Sqliteのデータを見るためには、良いグラフィックスインターフェースのデータベース管理プログラムが必要です.mysqlはphpMyAdminがありますが、sqliteは?
私は主にFirefoxのSQLite Managerというプラグインを使っていますが、このプラグインをインストールすると、接尾語のデータベースファイルを直接開くことができます.SQLite Managerはグラフィカルなインターフェースを提供して、データクエリまたは変更操作を実行します.下図のように:
【iOS功能实现】之:使用FMDB连接SQLite_第1张图片
締め括りをつける
FMBBはSQLite APIを友好的にパッケージ化し、使用上非常に便利であり、純Sqlite APIを使用してデータベース操作を行うappに対しては、FMBBベースに移行することが考えられ、これは今後のデータベース関連機能の開発維持に対して、多くの効果を高めることができる.
fmdbを勉強している間に、小さいプロジェクトをして練習に使いました.興味のあるものは自分でダウンロードできます.https://github.com/tangqiaoboy/FmdbSample
皆さん、楽しんでください.
Posted by 唐の巧妙 アプリ22 nd、2012 iOS
オリジナル文章、著作権声明:自由転載-非商用-非派生-署名を保持する Creative Commons BY-NC-ND 3.0
自己テストプログラム
癜import
噫import「FMDabrate.h」
葃import「FMDathabase Additions.h」
皱import「FMDathabase Pool.h」
噫import「FMDathable Que.h」
int main(int argc、const char*argv[])
{
    @autreleasepool{
        
       //insert code here…
        NSLog(@「ハロー、ワールド!」)
       NSFileManager*filemgr;
       NSString*currentpath;
        
        filemgr=[NSFileManagerallo]init]
        
        currentpath=[filemgrerent DirectoryPath]
       //NSLog(@'@,currentpath);
        
       NSString*dbpath  = [currentpath strigByApple PathComponent:@「I 3 D B.db 3」;
       FMDathabase*db=[FMDathabasedateabasewith:dbpath]
       if(db==NULL)
        {
            NSLog(@"Create DB failed!")
        }
        
        [dbopen]
        
        FMusesult Set*rs=[dbexecuteQuery:@「select*from Tab MHz where id=1」
       while([rs next]){
            
           NSLog(@@)、[rstringForColumn:@work]
        }
        [dbclose]
    }
   return 0;
)データの置く位置に注意して、debugディレクトリの下にあります.