sqlite 3使用

6336 ワード

SQLiteはソフトウェアライブラリであり、自給自足、サーバレス、ゼロ構成、トランザクションのSQLデータベースエンジンを実現しています.SQLiteは、世界で最も広く導入されているSQLデータベースエンジンです.SQLiteソースコードは著作権に制限されません.
@interface SQLiteManager : NSObject
+ (SQLiteManager *)shareSQL;
/**
 *       
 */
- (void)open;
/**
 *       
 */
- (void)close;
/**
 *     
 */
- (void)create;
/**
 *      
 */
- (void)insert;
/**
 *      
 */
- (void)select;
/**
 *      
 */
- (void)deleteData;
@end
#import 

@interface SQLiteManager ()
{
    sqlite3 *db;
}
@end

@implementation SQLiteManager
+ (SQLiteManager *)shareSQL {
    static SQLiteManager *sqlManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sqlManager = [SQLiteManager new];
    });
    return sqlManager;
}

- (void)open {
    //document    
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //sqlite  
    NSString *sqlitePath = [documentPath stringByAppendingPathComponent:@"database.sqlite"];

    /**
     *       
     *
     *  @param UTF8String] [sqlitePath UTF8String]  OC     C   
     *                  sqlite  ,      ,       
     *
     *  @return        
     */
    int result = sqlite3_open([sqlitePath UTF8String], &db);
    if (result == SQLITE_OK) {
        NSLog(@"       ");
    }else {
        NSLog(@"       ");
    }
}

- (void)close {
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"       ");
    }else {
        NSLog(@"       ");
    }
}

- (void)create {
    NSString *sql = @"create table Person (id integer, name text)";
    char *error = nil;
    /**
     *    sql  
     *  1.      
     *  2.     SQL
     *  3. callBack    SQL  ,     C      ,     nil
     *  4.      callBack     ,     nil
     *  5.     
     */
    sqlite3_exec(db, sql.UTF8String, nil, nil, &error);
    if (error == nil) {
        NSLog(@"     ");
    }else {
        NSLog(@"%s", error);
    }
}
- (void)insert {
    
    NSDate *time = [NSDate date];
    NSLog(@"      ");
    NSLog(@"    ");
    [self execSQL:@"BEGIN TRANSACTION"];
    for (int i = 0; i < 100000; i++) {
        NSString *sql = @"insert into Person values (0, '  ')";
        if ([self execSQL:sql]) {
//            NSLog(@"    ");
        }else {
            NSLog(@"    ");
        }
    }
    [self execSQL:@"COMMIT TRANSACTION"];
    NSLog(@"  ");
    NSLog(@"%f", [[NSDate date] timeIntervalSinceDate:time]);
}
- (void)select {
    NSString *sql = @"select * from Person";
    sqlite3_stmt * stmt = nil;
    /**
     *     sql
     *
     *  @param db                
     *  @param sql.UTF8String sql  
     *  @param -1             sql    , -1         
     *  @param stmt                   
     *  @param nil                
     *
     *  @return     
     */
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil);
    if (result == SQLITE_OK) {
        //    ,            
        /**
         * Person
         *
         * integer, name
         *  0   '  '
         *  1   '  '
         *  2   '  '
         */
        //while             ,sqlite3_column_%,     
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            /**
             *         
             *
             *  @param stmt      
             *  @param 0       Person     ,     , 0       , 1       ,      
             *  @param sqlite3_column_count();            
             *  @return    ,
             */
            int count = sqlite3_column_count(stmt);
            for (int i = 0; i < count; i++) {
                //1 >   ,  C     OC   
                NSString *name = [[NSString alloc] initWithCString:sqlite3_column_name(stmt, i) encoding:NSUTF8StringEncoding];
                //2 >         
                int type = sqlite3_column_type(stmt, i);

                id objValue;
                double doubleVaule;
                NSInteger integerValue;
                NSString *typeString;
                switch (type) {
                    case SQLITE_FLOAT:
                        typeString = @"  ";
                        doubleVaule = sqlite3_column_double(stmt, i);
                        NSLog(@"name = %@, type = %@, value = %f", name, typeString, doubleVaule);
                        break;
                    case SQLITE3_TEXT:
                        typeString = @"   ";
                        objValue = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, i)];
                        NSLog(@"name = %@, type = %@, value = %@", name, typeString, objValue);
                        break;
                    case SQLITE_INTEGER:
                        typeString = @"  ";
                        integerValue = (NSInteger)sqlite3_column_int64(stmt, i);
                        NSLog(@"name = %@, type = %@, value = %ld", name, typeString, integerValue);
                        break;
                    case SQLITE_NULL:
                        typeString = @"  ";
                        objValue = [NSNull null];
                        NSLog(@"name = %@, type = %@, value = %@", name, typeString, objValue);
                        break;
                    default:
                        NSLog(@"        ");
                        break;
                }
                
            }
        }
        /**
         *       
         */
        sqlite3_finalize(stmt);
    }

}
- (void)deleteData {
    NSString *sql = @"delete from Person where id = 0";
    if ([self execSQL:sql]) {
        NSLog(@"      ");
    }else {
        NSLog(@"     ");
    }
}

- (BOOL)execSQL:(NSString *)sql {
    char *error = nil;
    sqlite3_exec(db, sql.UTF8String, nil, nil, &error);
    if (error == nil) {
        return YES;
    }else {
        NSLog(@"%s", error);
        return NO;
    }

}
/**
 *   SQLite      ,           ,                   ,       ,     
 *           , SQLite               ,        .
 *        ,          ,        ,     ,            
 */
@end

sqlite 3とFMDB