[数据存储]Sqlite

来源:互联网 发布:php 源代码 登录 权限 编辑:程序博客网 时间:2024/06/07 06:49

一、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.csdn.net/detail/wanghuafeng123456/5891439

原创粉丝点击