iOSのステップアップ-SQLiteデータベース

9309 ワード

一、データベース管理システム
SQL言語概念SQLは構造化されたクエリー言語であり、TAはデータベースのために作成された操作コマンドセットであり、機能が整ったデータベース言語である.
  • 一般的なデータベース言語:MySQL、Oracle
  • データベース管理システム
    データベースの特徴:
  • は、一定の方法で一緒に記憶する
  • .
  • は、複数のユーザに対して
  • を共有することができる.
  • は、できるだけ少ない冗長コード
  • を有する.
  • とプログラムが互いに独立するデータセット
  • こんなに多くのデータベースに関する知識を話しているのに、いったい何がデータベースなのか.
  • データベース(Database)は、データ構造に従ってデータを整理、格納、管理する倉庫
  • である.
    データベースの分類リレーショナル・データベース(主流)、オブジェクト・データベース、階層データベース
    共通リレーショナル・データベースPC側:Oracle、MySQL、SQL Server、Access、DB 2、Sybase埋め込み/モバイル・クライアント:SQLite
    SQLiteは軽量レベルのリレーショナル・データベースです.SQLiteの当初の設計目標は組み込みシステムであり、TAの占有資源は非常に少なく、組み込み機器では数百Kのメモリだけで十分であり、現在はAndroid、iOS、Windows Phoneなどのスマートフォンに応用されている.iOS使用時のSQLiteは、libsqlite 3を追加するだけです.0.tbd依存およびsqlite 3の導入.hヘッダファイルでOK
    データベースにはいくつかの重要な概念があります
    表:データベース内の非常に重要なオブジェクトであり、他のオブジェクトの基礎です.情報の分類状況に応じて、1つのデータベースに複数のデータテーブルが含まれる場合があります.
    ≪フィールド|Fields|oem_src≫:表の列は「≪フィールド|Fields|oem_src≫」と呼ばれ、各フィールドには特定のトピックの情報が含まれます.
    レコード:データ・テーブルの1行の情報に対応する完全な関連情報のセットです.
    SQLの重要な点は、SQLが大文字と小文字に敏感ではないことを覚えておいてください.
    SQL文の後のセミコロン
    データベースシステムでセミコロンは各SQL文を区切る標準的な方法であり、サーバに対する同じ要求で1つ以上の文を実行することができます.注意しなければならないのは、一部のデータベースでは各SQLコマンドSQLの末尾にセミコロンを付ける必要がありますが、SQLiteは別のクラスに属し、TAの文の末尾にセミコロンは使用されません.
  • PS:Objective-Cを学習するとき、各文の末尾にセミコロンを付ける必要がありますが、SQLiteは
  • を区別する必要はありません.
    SQLiteデータベースのデータ型SQLiteはタイプのないデータベースであり、任意のタイプのデータを保存することができ、SQLiteにとってフィールドにタイプを指定しないのはSQLiteと他のデータベースとの互換性を最大化するために完全に有効であり、SQLiteは「タイプ近似」の観点をサポートし、列のタイプ近似は列上のデータを格納する推奨タイプを指す.
    SQLite近似型規則
  • タイプ文字列に「int」が含まれている場合、このフィールドの親縁タイプはINTEGER
  • である.
  • タイプ文字列に「char」、「clob」または「text」が含まれている場合、このフィールドの親縁タイプは、VARCHR
  • のようなTEXTである
  • タイプ文字列に「blob」が含まれている場合、このフィールドの親縁タイプはnone
  • です.
  • タイプ文字列に「real」、「floa」または「doub」が含まれている場合、このフィールドの親縁タイプはreal
  • です.
  • 残りの場合、フィールドの親縁タイプはNUMERIC
  • である.
    SQLiteフィールド制約
  • not null-非空
  • unique-ユニーク
  • primary key-プライマリ・キー
  • foreign key-外部キー
  • check-条件チェックは、1列のすべての値が一定の条件
  • を満たすことを保証する.
  • default-デフォルト
  • autoincreatement-自己増加変数
  • SQL文
  • SQLの文は、データ操作言語(DML)とデータ定義言語(DDL)
  • の2つの部分に分けられます.
    クエリと更新命令はSQLのDML部分を構成します.
  • データ挿入コマンド-insert
  • データベース更新コマンド-update
  • データベース削除コマンド-delete
  • データベース検索コマンド-select
  • DDLセクションでは、アクティブな削除テーブルを作成できます.インデックスを定義したり、テーブル間のリンクを指定したり、テーブル間の制約を適用したりすることもできます.
  • データベース作成コマンド-create database
  • データベースコマンドの変更-alter database
  • 新しいテーブルを作成するコマンド-create table
  • データベース内のテーブルを変更する——alter table
  • 削除テーブル——drop table
  • インデックスの作成-create index
  • インデックスの削除-drop index
  • 三、iOSのデータベース技術の実現
    SQLiteの使用を開始するために必要ないくつかのステップ
    必要なフレームワーク:libsqlite 3.0.tbd
  • ヘッダファイル
  • を導入
  • データベースを開く
  • SQLコマンドを実行する——表を作成して、添削して調べるなどの操作
  • データベースを閉じる
  • データベースのオン/オフ
  • 私たちのiOSプログラムでは、一般的には1つのデータベースしかありません.私たちはデータベースに複数のテーブルを作成して異なる情報を保存することができますが、複数のデータベースを作成しないでください.各データベースには1つのテーブルしかありません.接続が絶えないため、データベースを閉じるのはパフォーマンスのかかる
  • です.
    データベース操作用のDBクラスの作成
    データベースを開く
    #import "DB.h"
    
    @implementation DB
    
    //        
    static sqlite3 *db = nil;
    
    //      
    + (sqlite3 *)open {
        
        //               
        //            
        //            SQLite API(  )     ,            ,    
    
        //    
        if (db != nil) {
            return db;
        }
        
        //   Documents  
        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
        
        //               
        NSString *sqlPath = [docPath stringByAppendingPathComponent:@"studentDB.sqlite"];
        
        //         
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        //                 ,            ,            
        if ([fileManager fileExistsAtPath:sqlPath] == NO) {
            //              
            NSString *filePath = [[NSBundle mainBundle] pathForResource:@"studentDB" ofType:@"sqlite"];
            
            //               
            //              
            //                     
            [fileManager copyItemAtPath:filePath toPath:sqlPath error:nil];
            
        }
        
        //              
        //             (      C      ,   NSString        )
        //              
        sqlite3_open([sqlPath UTF8String], &db);
        
        return db;
    }
    

    データベースを閉じる
    //      
    + (void)close {
        
        //      
        sqlite3_close(db);
        
        //          
        db = nil;
        
    }
    

    学生クラスを作成
    テーブルの作成方法
    //      
    - (void)createTable {
        
        //     sql    NSString   
        NSString *sql = @"create table if not exists stu (ID integer primary key, name text not null, gender text default ' ')";
        
        //      
        sqlite3 *db = [DB open];
        
        //   sql  
        int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
        
        if (result == SQLITE_OK) {
            NSLog(@"    ");
        } else {
            NSLog(@"    ");
        }
        
        //      
        [DB close];
    
    }
    

    テーブル内のすべての学生を取得
    //            
    + (NSArray *)allStudents {
        
        //      
        sqlite3 *db = [DB open];
        
        //         
        sqlite3_stmt *stmt = nil;
        
        //       
        NSMutableArray *mArr = nil;
        
        //                ,  sql       ,       ,         ,   sql  ,sql        
        int result = sqlite3_prepare_v2(db, "select * from Students", -1, &stmt, nil);
        if (result == SQLITE_OK) {
            
            //        
            mArr = [NSMutableArray arrayWithCapacity:0];
            
            // SQLite_ROW       ,sqlite3_step()           SQLite_ROW,           ,          ,           ,    sqlite3_step(),   SQLite_DONE,      
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                
                //          
                //           ,           , 0  
                int ID = sqlite3_column_int(stmt, 0);
                const unsigned char *cName = sqlite3_column_text(stmt, 1);
                const unsigned char *cGender = sqlite3_column_text(stmt, 2);
                
                //      C        OC   
                NSString *name = [NSString stringWithUTF8String:(const char *)cName];
                NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
                Student *student = [Student studentWithID:ID name:name gender:gender];
                
                //           
                [mArr addObject:student];
            }
        }
        
        //      
        sqlite3_finalize(stmt);
        
        return mArr;
        
    }
    

    対応IDの学生を検索
    //      ID,        
    + (Student *)findStudentByID:(int)ID {
        
        //      
        sqlite3 *db = [DB open];
        
        //         
        sqlite3_stmt *stmt = nil;
        
        Student *student = nil;
        
        //       
        int result = sqlite3_prepare_v2(db, "select * from Students where ID = ?", -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            
            //           sql     ,            ,sql    ?     ,         ,     
            // 1  sql         ,       1   
            sqlite3_bind_int(stmt, 1, ID);
            
            if (sqlite3_step(stmt) == SQLITE_ROW) {
                
                //           
                const unsigned char *cName = sqlite3_column_text(stmt, 1);
                const unsigned char *cGender = sqlite3_column_text(stmt, 2);
                
                //  C        OC   
                NSString *name = [NSString stringWithUTF8String:(const char *)cName];
                NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
                
                student = [Student studentWithID:ID name:name gender:gender];
                
            }
        }
        
        //        
        sqlite3_finalize(stmt);
        return student;
        
    }
    

    テーブルにレコードを追加
    //       
    + (void)insertStudentWithID:(int)ID name:(NSString *)name gender:(NSString *)gender {
        
        //      
        sqlite3 *db = [DB open];
        
        sqlite3_stmt *stmt = nil;
        
        int result = sqlite3_prepare_v2(db, "insert into Students values(?,?,?)", -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            //   
            sqlite3_bind_int(stmt, 1, ID);
            sqlite3_bind_text(stmt, 2, [name UTF8String], -1, nil);
            sqlite3_bind_text(stmt, 3, [gender UTF8String], -1, nil);
            
            //         ,         
            sqlite3_step(stmt);
            
        }
        
        //       
        sqlite3_finalize(stmt);
        
    }
    

    レコードの更新
    //     ID       
    + (void)updateStudentName:(NSString *)name gender:(NSString *)gender forID:(int)ID {
        
        //      
        sqlite3 *db = [DB open];
        
        sqlite3_stmt *stmt = nil;
        
        int result = sqlite3_prepare_v2(db, "update Student set name = ?, gender = ? where ID = ?", -1, &stmt, nil);
        if (result == SQLITE_OK) {
            sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
            sqlite3_bind_text(stmt, 2, [gender UTF8String], -1, nil);
            sqlite3_bind_int(stmt, 3, ID);
            
            sqlite3_step(stmt);
        }
        sqlite3_finalize(stmt);
    }
    

    レコードの削除
    //     ID    
    + (void)deleteStudentByID:(int)ID {
        
        //      
        sqlite3 *db = [DB open];
        
        sqlite3_stmt *stmt = nil;
        
        int result = sqlite3_prepare_v2(db, "delete from Students where ID = ?", -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            sqlite3_bind_int(stmt, 1, ID);
            sqlite3_step(stmt);
        }
        
        sqlite3_finalize(stmt); 
        
    }