zoukankan      html  css  js  c++  java
  • 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来接收从数据库取出的字符串。 
     
  • 相关阅读:
    Model I/O
    How to create realistic .scn files?
    3ds Max 教程
    ELK Stack企业日志平台文档
    源码搭建Zabbix4.0.23LTS监控系统
    Ansible自动化运维应用实战
    网站架构部署
    MySQL数据库性能优化与监控实战(阶段四)
    MySQL数据库企业集群项目实战(阶段三)
    基于xtrabackup的主从同步
  • 原文地址:https://www.cnblogs.com/lignpeng/p/5458345.html
Copyright © 2011-2022 走看看