SQLite3

特点:
1、在哪个目录下创建数据库,就会在该目录下保存数据库
SQLite的不足:
1、还不支持外键约束,(3.6版本以下)
管理工具:
a、SQLite Database Browser (http://sqlitebrowser.sourceforge.net)
d、SQLite Analyzer的工具:获得关于物理的数据库结构信息,SQLite 网站上下载
e、NavicatPremium11-1-12.dmg
 
在iOS使用SQLite
放置位置在SandBox中的Documents
采用SQLite数据库来存储数据。
SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
第一步:准备工作
1、导入库:libsqlite3.dylib(如果没有导入,会报各种错误)
2、在项目中添加头文件
     #import "sqlite3.h"
第二步:开始使用SQLite:
     使用前注意:如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。
过程:
1、准备数据库路径,创建或打开数据库,成功会返回打开的数据库:sqlite3_open
2、创建或打开表,如果没有就创建
     执行SQL语句的方法:sqlite3_exec
3、插入数据
4、关闭数据库
//1. 准备SQLite数据库文件的路径
NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]stringByAppendingPathComponent:@"demo1.db"];
NSLog(@"%@", dbPath);
//2. 创建或打开数据库,如果打开数据库成功,db这个指针就会指向打开的数据库.
sqlite3 *db = NULL;
int res = sqlite3_open(dbPath.UTF8String, &db);//因为是C语言的API,以此要使用C语言数据类型
if(res != SQLITE_OK){// #define SQLITE_OK 0  成功返回零
    NSLog(@"打开或创建数据库失败:%s", sqlite3_errmsg(db));
    return;
}
NSLog(@"数据库打开成功");
//3. 创建一张表3.1 准备建表的SQL语句,IF NOT EXISTS:如果不存在就....
const char* sql = "CREATE TABLE IF NOT EXISTS persons (id integer PRIMARY KEY, name varchar(20), age int, salary double)";
//3.2 执行SQL语句
char *errmsg = NULL;
res = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(res != SQLITE_OK) {
    NSLog(@"SQL执行失败:%s", errmsg);
}
//4. 插入数据
sql = "INSERT INTO persons(name, age, salary) VALUES('Guodh', 31, 120000)";
res = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(res != SQLITE_OK){
    NSLog(@"插入数据失败:%s", errmsg);
}
//5. 释放数据库及其他资源
sqlite3_close(db);
//errmsg指向的信息在堆中存放,所以也需要释放
sqlite3_free(errmsg);
 
//注:插入数据,是我们预写好的语句,但是实际中,我们的数据是变动的,因此,也就不能这么写了。
使用另外的方法:预编译SQL语句
//3. 保存数据
for(int i=0; i<self.lineFields.count; i++){
    //2.1 准备保存数据的SQL语句
    const char* sql = "INSERT OR REPLACE INTO lines(row, field_text) VALUES (?, ?)";
    //2.2 预编译SQL语句
    sqlite3_stmt *stmt = nil;//用来保存预编译结果的对象
    res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if(res == SQLITE_OK){//预编译成功
        sqlite3_bind_int(stmt, 1, i);//给第一个?绑定值(stmt, 第一个?, 值)
        UITextField *field = self.lineFields[i];
        sqlite3_bind_text(stmt, 2, field.text.UTF8String, -1, NULL);//给第二个?绑定值
    }
    //2.3 执行SQL语句
    sqlite3_step(stmt);
    //2.4结束SQL语句的执行
    sqlite3_finalize(stmt);
}
//4. 关闭数据库
sqlite3_close(db);
 
读取数据库中的内容
//2.1 打开数据库
sqlite3 *db = NULL;
if(sqlite3_open(self.dbPath.UTF8String, &db) != SQLITE_OK){
    NSLog(@"打开数据库失败");
}
//2.2 准备SQL语句
const char* sql = "SELECT row, field_text FROM lines ORDER BY row";
//2.3 拿到SQL语句执行的结果,显示到界面
sqlite3_stmt *stmt = NULL;
if(sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)==SQLITE_OK){
    //从结果中一条一条的拿记录
    while(sqlite3_step(stmt)==SQLITE_ROW){//获取到一条记录
        //从这条记录中拿第一个字段的值
        int row = sqlite3_column_int(stmt, 0);//需要指定要读取的数据类型,尽管知道它是什么类型的
        //第二个字段的值
        char* data = (char*)sqlite3_column_text(stmt, 1);
        //将数据显示到对应的TextField上
        UITextField *field = self.lineFields[row];
        field.text = [NSString stringWithFormat:@"%s", data];
    }
    sqlite3_finalize(stmt);
}
sqlite3_close(db);
 
注意:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符 时,会出现乱码。这是因为数据库默认使用ascII编码方式。所以要想正确从数据库中取出中文,需要用 NSString来接收从数据库取出的字符串。 
 
posted @ 2016-05-04 14:38  bonjour520  阅读(196)  评论(0编辑  收藏  举报