数据库

作者: 康大侠 | 来源:发表于2015-12-07 09:48 被阅读96次

SQLite3

SQL语句定义

SQL语句是对关系数据库进行定义和操作的语句。

SQLite将数据值的存储划分为以下几种存储类型:
NULL: 表示该值为NULL值。
INTEGER: 无符号整型值。
REAL: 浮点值。
TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
BLOB: 存储Blob数据,该类型数据和输入数据完全相同。

  • 注意:
    1.要以;结尾。
    2.SQLite是无类型的,但是为了程序员交流最好写上类型

增删改查(CRUD) create、read、update、delete。

  • 创建表
    1.CREATE TABLE IF NOT EXISTS t_dog(name text,age integer);
    2.有主键限制的创建PRIMARY KEY,主键包含了唯一性。主键会自增长,不能设置为字符串
    CREATE TABLE IF NOT EXISTS t_pig(id integer PRIMARY KEY)

  • NOT NULL标识某个字段为非空
    CREATE TABLE IF NOT EXISTS t_dog(name text NOT NULL,age integer);

2.UNIQUE字段名称唯一,如果有一个叫“李四”,不能出现第二个“李四”
CREATE TABLE IF NOT EXISTS t_dog(name text NOT NULL UNIQUE,age integer);

3.DEFAULT设置默认值,可以根据设置改变
CREATE TABLE IF NOT EXISTS t_cat(name text NOT NULL UNIQUE,age integer DEFAULT 1);

  • 删除表
    DROP TABLE IF EXISTS t_dog;

  • 增(插入)
    INSERT INTO t_shop (name , price ,left_count) VALUES ('手机',2001.0,500);
    注:使用单引号,属性可以不写全
    INSERT INTO t_shop (name,left_count) VALUES ('风扇', 600);


  • 1.与AND
    DELETE FROM t_shop WHERE price <= 1202 AND left_count < 100
    2.或OR
    DELETE FROM t_shop WHERE price <= 1202 OR left_count < 100


  • UPDATE t_shop SET price = 900 ,left_count = 200;


  • SELECT * FROM t_shop
    SELECT * FROM t_shop WHERE price > 800
    //默认是升序
    SELECT * FROM t_shop ORDER BY price
    //降序
    SELECT * FROM t_shop ORDER BY price DESC;
    //升序
    SELECT * FROM t_shop ORDER BY price ASC;
    //先按照price升序,然后按照left_count降序
    SELECT * FROM t_shop ORDER BY price ASC , left_count DESC
    //模糊查询
    SELECT * FROM t_shop WHERE price like ‘%800%’

常见操作

  • 计算记录的数量
    1.SELECT count(name) FROM t_shop
    2.常用(只计算一次,同样是统计记录的数量)
    SELECT count(*) 剩余数量 FROM t_shop

  • 分页
    LIMIT 0,2 等价于 LIMIT 2
    SELECT * FROM t_shop ORDER BY price DESC LIMIT 0 ,2

FMDB

FMDB有三个主要的类
参考
FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句
FMResultSet
使用FMDatabase执行查询后的结果集

FMResultSet 提供了很多方法来获得所需的格式的值:

    intForColumn:
    longForColumn:
    longLongIntForColumn:
    boolForColumn:
    doubleForColumn:
    stringForColumn:
    dataForColumn:
    dataNoCopyForColumn:
    UTF8StringForColumnIndex:
    objectForColumn:

FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的

  • executeQuery:查询数据
    - (FMResultSet *)executeQuery:(NSString*)sql, ...;
  • executeUpdate:除查询数据以外的其他操作
    - (BOOL)executeUpdate:(NSString*)sql, ...;

set = [_db executeQuery:@"select * from t_collects where userId = ? and workid = ?;",userId,dict[@"ID"]];
if ([set next]) {
//更新
}else{
//插入
}

  • 为什么只有一条数据的时候也要用next?
    因为查询的结果是一个结果集,可以理解成一个集合.next则是进行了对于集合的遍历操作.所以结果只有一条的时候也要调用next
 // 1.打开数据库
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"shops.sqlite"];
    _db = [FMDatabase databaseWithPath:path];
    [_db open];
    
// 2.创表
[_db executeUpdate:@"create table if not exists t_collects (id integer primary key autoincrement,createat text not null, access_token text not null,workid integer not null,list blob,userId integer not null,Fid integer not null unique );"];

//根据字典保存到数据库
+ (void)saveCollect:(NSDictionary *)dict
{
    if (dict == nil) {
        return;
    }
    NSNumber *userId = [YQUserInfoModel takeUserToken].ID;
    FMResultSet *set = nil;
    set = [_db executeQuery:@"select * from t_collects where userId = ? and workid = ?;",userId,dict[@"ID"]];
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];
//为什么查询的结果只有一条也要调用next方法?
    if ([set next]) {
        [_db executeUpdate:@"UPDATE t_collects SET list = ? WHERE workid = ? ;",data,dict[@"ID"]];
    }else{
        [_db executeUpdate:@"insert into t_collects (userId,list,createat,workid,access_token,Fid) values (?, ?, ?, ?, ?, ?);",userId,data,dict[@"CreateAt"],dict[@"ID"],@"collect",dict[@"Fid"]];
    }
    [set close];
}

//从数据库取出全部数据
+ (NSMutableArray *)cacheCollects
{
    NSNumber *userId = [YQUserInfoModel takeUserToken].ID;
    FMResultSet *set = nil;
    set = [_db executeQuery:@"select * from t_collects where userId = ? order by Fid desc;",userId];
    NSMutableArray *listArr = [NSMutableArray array];
    while([set next]) {
        NSData *data = [set dataForColumn:@"list"];
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        YQWorkList *list = [YQWorkList modelWithKeyValues:dict];
        [listArr addObject:list];
    }
    [set close];
    return listArr;
}
//根据主键查询信息
+ (YQWorkList *)searchCollectsWithID:(NSInteger )ID
{
    FMResultSet *set = nil;
    set = [_db executeQuery:@"select * from t_collects where workid = ?;",@(ID)];
    YQWorkList *list = nil;
    if ([set next]) {
        NSData *data = [set dataForColumn:@"list"];
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        list = [YQWorkList modelWithKeyValues:dict];
    }
    [set close];
    return list;
}

//删除数据库
+ (void)deleteCollectsWithID:(NSInteger)ID
{
    [_db executeUpdate:@"delete from t_collects where workid = ?;",@(ID)];
}

+ (void)deleteCollects
{
    [_db executeUpdate:@"delete from t_collects ;"];
}

将图片保存到数据库

http://m.blog.csdn.net/blog/wei78008023/44903541

相关文章

  • MySQL数据库day01

    系统数据库 ​​​ 创建数据库 ​​​ ​​​ ​​​ ​​​ 查看所有数据库 使用数据库 修改数据库 删除数据库...

  • 数据库操作

    创建数据库: 选择数据库: 查看数据库: 修改数据库: 删除数据库:

  • Ubuntu操作mysql数据库命令

    一、连接数据库 连接本地数据库 退出数据库 二、操作数据库 创建数据库 显示数据库 删除数据库 连接数据库 查看状...

  • 4-14

    创建数据库 createdatabase数据库名称; 删除数据库 dropdatabase数据库名称; 查看数据库...

  • [后端开发] Mysql学习笔记

    1.0 数据库 创建数据库 查看所有数据库 删除数据库 切换数据库名 查看正在使用的数据库 2.0 数据库表 创...

  • 2020最新最全数据库系统安全

    数据库标识与鉴别 数据库访问控制 数据库安全审计 数据库备份与恢复 数据库加密 资源限制 数据库安全加固 数据库安...

  • 2020-01-05 sql基本概念

    数据库用来储存数据。 数据库的种类大致有:层次数据库、关系数据库、面向对象数据库、XML数据库、键值数据库。 关系...

  • Mysql数据库基本操作

    连接数据库 退出数据库 查看数据库版本 显示数据库时间 查看当前使用的数据库 查看所有数据库 数据库备份 导入数据...

  • mysql命令行操作

    准备 登陆 数据库操作 查看现有数据库 创建数据库 删除数据库 查看数据库 使用数据库 查看当前数据库 表操作 新...

  • 1.7.1 MySQL数据库学习

    1. 数据库命令行学习 进入数据库 创建数据库 查看数据库列表 删除数据库 使用数据库 查看当前数据库 2. 表 ...

网友评论

    本文标题:数据库

    本文链接:https://www.haomeiwen.com/subject/amkehttx.html