sqlite 3ベース

16907 ワード

sqliteを使用するには、まずライブラリファイルlibsqlite 3を追加する必要があります.dylib.libsqlite 3のキーワードを検索すると、libsqlite 3がもう1つ見つかります.0.dylibのライブラリファイル、ここではlibsqlite 3を追加することをお勧めします.dylib、原因はlibsqlite 3にある.dylibは、常に最新のsqlite 3ダイナミックライブラリを指す代替ファイルです.新しいダイナミックライブラリが現れた場合libsqlite 3.1.dylibではlibsqlite 3.dylibはそれを指し、libsqlite 3.0.dylibは指向できません.
sqliteデータベースを操作する前に、sqlite 3タイプのオブジェクトを宣言します.
sqlite3 *db;

sqlite3_Open-sqliteデータベースを作成して開きます
SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

sqlite3_close-sqliteデータベースを閉じます
SQLITE_API int sqlite3_close(sqlite3*);

例1:sqliteデータベースを作成して開く
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSLog(@"documentsPath: %@",documentsPath);

NSString *databasePath = [documentsPath stringByAppendingPathComponent:@"personinfo.sqlite"];
NSLog(@"databasePath: %@",databasePath);

int state = sqlite3_open([databasePath UTF8String], &db);
NSLog(@"%d",state);

if(state != SQLITE_OK) {
    sqlite3_close(db);
    NSLog(@"       ");
}

sqlite3_exec-クエリー以外のsql文を実行
SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

例2:テーブルの作成、データの挿入
- (BOOL)execSql:(NSString *)sql {
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
        sqlite3_close(db);
        NSLog(@"execute sql fail!");
        return NO;
    }
    else {
        NSLog(@"execute sql succeed!");
        return YES;
    }
}

- (IBAction)createTable:(id)sender {
    NSLog(@"button clicked");
    NSString *strSql = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";
    
    [self execSql:strSql];
}

- (IBAction)insertAction:(id)sender {
    NSLog(@"insert action");
    NSString *sql1 = [NSString stringWithFormat:
                      @"INSERT INTO 'PERSONINFO' ('name', 'age', 'address') VALUES ('%@', '%@', '%@')",
                      @"  ", @"23", @"   "];
    
    NSString *sql2 = [NSString stringWithFormat:
                      @"INSERT INTO 'PERSONINFO' ('name', 'age', 'address') VALUES ('%@', '%@', '%@')",
                      @"  ", @"20", @"   "];
    [self execSql:sql1];
    [self execSql:sql2];
}

sqlite3_stmt-ODBCのcommandオブジェクトに相当し、コンパイルされたsql文を保存します.
sqlite3_prepare_v 2-この関数は、sqlテキストを準備文(prepared statement)オブジェクトに変換し、そのオブジェクトのポインタを返します.実際にはこのsql文は実行されず、実行のためだけにこのsql文が用意されています.つまり、この関数が正常に呼び出された後(SQLITE_OK)、sqlite 3_stmtは空のオブジェクトではありません.
SQLITE_API int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle(     ) */
  const char *zSql,       /* SQL statement, UTF-8 encoded(  UTF-8   SQL  ) */
  int nByte,              /* Maximum length of zSql in bytes.(  nByte  0,     zSql        0      ;  nByte    ,           zSql         。  nBytes    ,zSql      /000 u000     ) */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle(    sqlite3_step()              ,      ,    NULL,          sql  。             sql       ,  sqlite3_finalize()   。 */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql( zSql             nByte   ,         ,              pzTail ,      ) */
);

sqlite3_Step-実行はsqlite 3_prepareで作成された準備文.呼び出し後にSQLITE_を返します.ROWは、sqlite 3_を呼び出し続ける行がさらにあることを示します.Step SQLITE_が戻るまでDONE.Insert、update、delete文の場合はsqlite 3_を使用することもできます.Stepは実行しますが、sqlite 3_を使用することをお勧めします.exec.
SQLITE_API int sqlite3_step(sqlite3_stmt*);

sqlite3_Stepの戻り値はsqlite 3_の作成に依存するstmtパラメータで使用される関数は、古いバージョンのインタフェースsqlite 3_を使用する場合prepare()またはsqlite 3_prepare 16()は、SQLITE_を返します.BUSY、SQLITE_DONE, SQLITE_ROW, SQLITE_ERRORまたはSQLITE_MISUSE;v 2バージョンのインタフェースsqlite 3_prepare_v 2()とsqlite 3_prepare16_v 2()は、これらの値に加えて、拡張ステータスコードを返すこともできる.
sqlite3_reset-準備文オブジェクトを初期状態にリセットし、再実行の準備をします.V 3.6.23.1以降、sqlite 3_Step()はsqlite 3を自動的に呼び出します.reset.
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);

sqlite3_finalize-メモリの漏洩を防ぐために、必要に応じて準備文オブジェクトを破棄します.文オブジェクトが空のポインタである場合にこの関数を呼び出すのも影響しません.
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);

例3:sqlite 3_の利用Step更新操作の実行
- (IBAction)updateAction:(id)sender {
    NSString *sqlQuery = @"update PERSONINFO set address='   ' where age='20'";

    sqlite3_stmt *statement;
    
    if(sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
        if(sqlite3_step(statement) == SQLITE_DONE) {
            NSLog(@"update succeed");
        }
        else {
            NSLog(@"update failed");
        }
    }
    sqlite3_finalize(statement);
}

sqlite3_column-sqlite 3は存在しません.columnという関数は、接頭辞にすぎません.次は関連する具体的な関数です.
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

上記の関数は、結果セットの現在のローのカラムの値を取得するために使用され、カラムインデックスは0から始まります.
例4:結果セットの問合せと印刷
- (IBAction)selectAction:(id)sender {
    NSString *sqlQuery = @"SELECT * FROM PERSONINFO";
    sqlite3_stmt *statement;
    
    if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            char *cID = (char*)sqlite3_column_text(statement, 0);
            NSString *strID = [[NSString alloc] initWithUTF8String:cID];
            
            char *cName = (char*)sqlite3_column_text(statement, 1);
            NSString *strName = [[NSString alloc] initWithUTF8String:cName];
            
            int age = sqlite3_column_int(statement, 2);
            
            char *cAddress = (char*)sqlite3_column_text(statement, 3);
            NSString *strAddress = [[NSString alloc] initWithUTF8String:cAddress];
            
            NSLog(@"id:%@  name:%@  age:%d  address:%@",strID, strName, age, strAddress);
        }
    }
    sqlite3_finalize(statement);
}