iOS进阶(数据库之SQLite)

//通过sqlite3创建一个数据库指针,将已有数据库的内容拷贝到沙盒中,对沙盒中的数据库数据进行操作

1.SQLite语句

在已有的数据库中创建表
 create table 表名称(ID integer primary key, name text not null, sex text default “男”)
 
 往表中插入数据
 insert into 表名称 (name, sex) values(“源源”, “男”) 字段可以无顺序,但是值一定要保证对应,并且此时 完全可以不设置sex字段的值,因为我们在创建表时 已经把性别设置为default了。
 insert into 表名称 values(11, “巴达”, “妖”) 必须保证设置的值与表中字段顺序一样
 
 修改表中某一条记录的信息
 update 表名称 set name = “hehe”, sex = “女” where ID = 1
 
 查询语句
 select ID,name,sex from 表名称 查询的结果与你查询的字段顺序是一样的。
 select * from 表名称 查询表中所有的字段信息,查询的结果与你表中字段顺序一样
 select * from 表名称 where ID = 1 后面可以跟条件查询具体想要的信息
 select * from 表名称 where ID > 1 and sex = “女” 可以跟多个条件,并且多个条件之间用and连接,此时查出来的是同up所有记录。如果多个条件之间用or连接,那么查出来的结果只需要满足其中一条就可以。
 select * from 表名称 where name like “%源%” 只要名字中包含源,都可以查询出来
 
 删除记录
 delete from 表名称 where name = “源源”

2.操作数据库步骤

创建一个类来操作数据库(注意要先导入libsqlite3.dylib)

static sqlite3 *db = nil;

//打开数据库
+ (sqlite3 *)open{
    //此方法的主要作用是打开数据库,准确的说是连接数据库
    //方绘制是一个数据库指针
    //因为 这个数据库指针在很多的SQLite API(函数)中都会用到,我们声明一个类的方法来获取,更加方便
    
    if (db != nil) {
        return db;
    }
    
    //获取documents文件
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    //生成数据库文件在沙盒中的位置
    NSString *sqlPath = [docPath stringByAppendingPathComponent:@"studb.sqlite"];
    //获取文件管理对象
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //判断沙盒路径中是否存在数据库文件,如果不存咋才执行拷贝操作,如果存在不在执行拷贝操作
    if ([fileManager fileExistsAtPath:sqlPath] == NO) {
        //获取数据库文件在包中的文件
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"studb" ofType:@"sqlite"];
        //使用文件管理对象完成管理对象
        [fileManager copyItemAtPath:filePath toPath:sqlPath error:nil];

    }
    
//    //创建一个数据库指针
//    sqlite3 *db = nil;
    

    //打开数据库需要使用以下函数
    //第一个参数是数据库路径
    //第二个参数 是指向数据库指针的指针
    sqlite3_open([sqlPath UTF8String], &db);
    
    return db;
}

//关闭数据库
+ (void)close{
    //关闭数据库
    sqlite3_close(db);
    
    //置空数据库指针
    db = nil;
    
}

//打开数据库--创建语句对象(保存了关联的数据库,执行的sql语句,sql语句的长度等信息)--逐行获取数据,并将读出来的C语言转化为OC语言--将数据保存入模型存放在数组中--最后不要忘记释放语句对象

//查找学生
+ (Student *)findStudentByID:(int)ID{
    //打开数据库
    sqlite3 *db = [DB open];
    
    sqlite3_stmt *stmt = nil;
    Student *student = nil;
    
    int result = sqlite3_prepare_v2(db, "select * from Students where ID = ?", -1, &stmt, nil);
    
    if (result == SQLITE_OK) {
        //如果查询语句或者 其他sql语句 有条件,在准备语句对象的函数内部,sql中用?来代替条件,那么在语句执行之前一定要绑定
        sqlite3_bind_int(stmt, 1, ID);//第二个参数表示第几个问号,问号的下标从1 开始
        if (sqlite3_step(stmt) == SQLITE_ROW) {
            //获取记录中的字段信息
            const unsigned char *cName = sqlite3_column_text(stmt, 1);
            const unsigned char *cGender = sqlite3_column_text(stmt, 2);

            //将C语言字符串转换成OC字符串
            NSString *name = [NSString stringWithUTF8String:(const char *)cName];
            NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
            student = [Student studentWithID:ID name:name gender:gender];
        }
    }
    //先释放语句对象
    sqlite3_finalize(stmt);
    return student;
}
原文地址:https://www.cnblogs.com/w150385/p/5251651.html