SQLite3

特色:
一、在哪一个目录下建立数据库,就会在该目录下保存数据库
SQLite的不足:
一、还不支持外键约束,(3.6版本如下)
管理工具:
a、SQLite Database Browser ( http://sqlitebrowser.sourceforge.net)
b、SQLite Control Center ( http://bobmanc.home.comcast.net/sqlitecc.html)
c、SQLiteManager ( www.sqlabs.net/sqlitemanager.php)
d、SQLite Analyzer的工具:得到关于物理的数据库结构信息,SQLite 网站上下载
e、NavicatPremium11-1-12.dmg
 
在iOS使用SQLite
放置位置在SandBox中的Documents
采用SQLite数据库来存储数据。
SQLite做为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
第一步:准备工做
一、导入库:libsqlite3.dylib(若是没有导入,会报各类错误)
二、在项目中添加头文件
     #import "sqlite3.h"
第二步:开始使用SQLite:
     使用前注意:若是不往数据库里面添加任何的表,这个数据库等于没有创建,不会在硬盘上产生任何文件,若是数据库已经存在,则会打开这个数据库。
过程:
一、准备数据库路径,建立或打开数据库,成功会返回打开的数据库:sqlite3_open
二、建立或打开表,若是没有就建立
     执行SQL语句的方法:sqlite3_exec
三、插入数据
四、关闭数据库
//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来接收从数据库取出的字符串。 
相关文章
相关标签/搜索