[数据存储]Sqlite

一、sqlite简介。

在ios中,大量的数据存储必然会用到数据库,而默认支持的数据库就是sqlite3这一轻量级数据库,sqlite是广泛应用在移动开发和嵌入式领域的关系型数据库。因为sqlite是由大概3万行C代码写成的,所以ios还是提供了一些接口来直接操作数据库的。

二、sqlite准备活动。

引入framework: libsqlite3.0.dylib。我们发现又两个库文件名很相似,libsqlite3.0.dylib和libsqlite3.dylib,首先说一下他们的差别。


这个文件结构很明显,libsqlite3.0.dylib是一个指向libsqlite3.dylib的链接,之所以有这样一个链接是因为libsqlite3.0.dylib指向的是最新的sqlite库文件,如果库文件有更新,哪天出了个>libsqlite3.5.dylib,如果我们引入工程的是链接的话,就不需要修改,直接会引用到最新的库文件。

然后在数据库操作的类里面,#import <sqlite3.h>    或者 #import"/usr/include/sqlite3.h"  。

三、sqlite操作

1. 数据库打开与关闭。

- (BOOL)openDatabase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [paths objectAtIndex:0];
    NSString *dbPath = [documentPath stringByAppendingPathComponent:DBNAME];
    if (sqlite3_open([dbPath UTF8String], &_db) != SQLITE_OK) {
        sqlite3_close(_db);
        NSLog(@"Can not open data base.");
        return NO;
    }
    return YES;
}
    sqlite3_close(_db);

创建的方法也是这个,数据库在打开的时候如果发现没有这个文件,那么会创建一个新的。

2. 创建表结构
    NSString *createTable = @"CREATE TABLE IF NOT EXISTS person_info (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";
    [self execSql:createTable];
- (void)execSql:(NSString *)sql
{
    char *error;
    int state = sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &error);
    
    if (state == SQLITE_OK) {
        NSLog(@"Success to exec: %s", [sql UTF8String]);
        sqlite3_close(_db);
    } else {
        NSLog(@"Failed to exec: %@. \nError: %@", sql, [NSString stringWithCString:error encoding:NSUTF8StringEncoding]);
        sqlite3_free(error);
        sqlite3_close(_db);
    }
}
3. 插入数据

- (BOOL)insertRecordWithName:(NSString *)name age:(NSInteger)age address:(NSString *)address
{
    [self openDatabase];
    NSString *data1 = [NSString stringWithFormat:@"INSERT INTO '%@' (name,age,address) VALUES (?,?,?);", TABLENAME];
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(_db, [data1 UTF8String], -1, &stmt, nil) == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
        sqlite3_bind_text(stmt, 2, [[NSString stringWithFormat:@"%i", age] UTF8String], -1, nil);
        sqlite3_bind_text(stmt, 3, [address UTF8String], -1, nil);
    }
    
    if (sqlite3_step(stmt) == SQLITE_DONE) {
        sqlite3_finalize(stmt);
        NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"INSERT INTO '%@' (name,age,address) VALUES (%@,%i,%@);", TABLENAME, name, age, address]);
        sqlite3_close(_db);
        return YES;
    } 
    return NO;
}

4. 查询数据

- (NSArray *)queryWith:(NSString *)name
{
    [self openDatabase];
    NSString *querySql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE name = ?", TABLENAME];
    sqlite3_stmt *stmt;
    NSMutableArray *resultArray = [NSMutableArray array];
    
    if (sqlite3_prepare(_db, [querySql UTF8String], -1, &stmt, nil) == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            char *name = (char *)sqlite3_column_text(stmt, 1);
            NSString *nameString = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
            int age = sqlite3_column_int(stmt, 2);
            NSString *ageString = [NSString stringWithFormat:@"%i", age];
            char *address = (char *)sqlite3_column_text(stmt, 3);
            NSString *addressString = [NSString stringWithCString:address encoding:NSUTF8StringEncoding];
            [resultArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:nameString, @"name", ageString, @"age", addressString, @"address", nil]];
        }
        NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"SELECT * FROM %@ WHERE name = %@", TABLENAME, name]);
    } else {
        return nil;
    }
    sqlite3_finalize(stmt);
    sqlite3_close(_db);
    return resultArray;
}

5. 删除数据

- (BOOL)deleteWith:(NSString *)name
{
    [self openDatabase];
    NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE name = ?", TABLENAME];
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, nil) == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
    }
    
    if (sqlite3_step(stmt) == SQLITE_DONE) {
        sqlite3_finalize(stmt);
        NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"DELETE FROM %@ WHERE name = %@", TABLENAME, name]);
        sqlite3_close(_db);
        return YES;
    }
    return NO;
}

至于更新数据,也就是sql语句的差别了,别的都一样。

基本数据库的操作就这些了,根据实际应用可以封装一下方法,方便调用。

OK,Done.

所有数据存储的例子:http://download.youkuaiyun.com/detail/wanghuafeng123456/5891439

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值