数据库 - sqlite3 基础 - 结合 fmdb

http://www.runoob.com/sqlite/sqlite-tutorial.html
sqlite基础教程,菜鸟网站。
iOS开发用到fmdb比较多,其实也就是执行SQL语句;这里简单使用了基础教程的SQL语句。

sqlite3

mac 终端直接进入 sqlite3:
sqlite3

数据类型

创建数据库

  • 创建(进入)数据库
    $sqlite3 DatabaseName.db

  • 检查数据库是否存在
    sqlite>.databases

  • 退出数据库
    sqlite>.quit

  • .db 与 .sql 互转
    $sqlite3 testDB.db .dump > testDB.sql
    $sqlite3 testDB.db < testDB.sql

  • 对应 fmdb

    self.dataBase = [FMDatabase databaseWithPath:dbPath];
    BOOL isOpen = [self.dataBase open];
    if (isOpen) {
        NSLog(@"db open ok ");
    }
    
    [self.dataBase close];

创建表 CREATE

CREATE TABLE tebleName (
id INTEGER PRIMARY KEY(one or more columns),
name TEXT,
age INTEGER,
mobile datatype,
);

  • 对应 fmdb
    NSString *tableName = @"tableName";
    NSString *nameKey = @"name";
    NSString *ageKey = @"age";
    NSString *createTableSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER PRIMARY KEY AUTOINCREMENT, %@ TEXT, %@ INTEGER)",tableName, nameKey, ageKey];
    
    BOOL isCreateTable = [self.dataBase executeUpdate:createTableSql];
    if (isCreateTable) {
        NSLog(@"建表 ok");
    }

删除表 DROP

DROP TABLE tableName;

  • 对应 fmdb
    NSString *deleteTableSql = [NSString stringWithFormat:@"DROP TABLE %@",tableName];
    BOOL isDeleteTable = [self.dataBase executeUpdate:deleteTableSql];
    if (isDeleteTable) {
        NSLog(@"删表 ok");
    }

插入数据 INSERT

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
或者
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

  • 对应 fmdb
    // 插法1
   NSString *insertNameValue = @"张三";
    NSInteger insertAgeValue = 19;
    
    NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@ (%@, %@) VALUES ('%@', %zi)", tableName, nameKey, ageKey, insertNameValue, insertAgeValue];
    BOOL isInsert = [self.dataBase executeUpdate:insertSql];
    if (isInsert) {
        NSLog(@"插入 ok");
    }

    // 插法2,注意 Value 个数要与创建时一致,下面的 9999 就是上面的 ID
    NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO %@ VALUES (9999, '%@', %zi)" , tableName, insertNameValue, insertAgeValue];
    BOOL isInsert2 = [self.dataBase executeUpdate:insertSql2];
    if (isInsert2) {
        NSLog(@"插入2 ok");
    }

更新数据 UPDATE

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

    NSString *updateSql = [NSString stringWithFormat:@"UPDATE %@ SET %@ = %zi WHERE %@ = '%@'",tableName, ageKey, 12, nameKey, @"张三"];
    BOOL isUpdate = [self.dataBase executeUpdate:updateSql];
    if (isUpdate) {
        NSLog(@"更新 成功");
    }

删除数据 DELETE

DELETE FROM table_name
WHERE [condition];

    NSString *deleteSql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ != %zi", tableName, ageKey, 12];
    BOOL isDelete = [self.dataBase executeUpdate:deleteSql];
    if (isDelete) {
        NSLog(@"删除 ok");
    }

查询

SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name;

// 下面几个是输出格式设置
sqlite>.header on
sqlite>.mode column
sqlite>.width 10, 20, 10
sqlite> SELECT * FROM COMPANY;

  • 对应 fmdb
    NSString *searchSql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ = '%@' AND %@ = %zi ",tableName, nameKey, @"张三", ageKey, 25];
    FMResultSet *result = [self.dataBase executeQuery:searchSql];
    while ([result next]) {
        NSString *name = [result stringForColumn:@"name"];
        NSInteger age = [result intForColumn:@"age"];
        NSLog(@"%@ - %zi",name, age);
    }
    [result close];

运算符

比较运算符:=,!=,>,>=........
逻辑运算符:AND, BETWEEN, EXISTS, IN, LIKE, GLOB, NOT......

举几个栗子

    // 模糊搜索 张%(%:多个,_:一个)
    NSString *searchSql1 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE '%@'", tableName, nameKey, @"张%"];
    // 模糊搜索 张* (区分大小写),(*:多个,?:一个)
    NSString *searchSql2 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ GLOB '%@'", tableName, nameKey, @"张*"];
    // 搜索 年龄是 19 和 29 的
    NSString *searchSql3 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ IN %@", tableName, ageKey, @"(19,29)"];
    // 搜索 年龄 20-30 之间的
    NSString *searchSql4 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ BETWEEN %zi AND %zi",tableName, ageKey, 20,30];

其他表达式 - 个数 时间

SELECT COUNT(*) AS "RECORDS" FROM COMPANY;
SELECT CURRENT_TIMESTAMP;

    NSString *searchSql11 = [NSString stringWithFormat:@"SELECT COUNT(*) AS COUNT FROM %@",tableName];
    NSString *searchSql12 = [NSString stringWithFormat:@"SELECT CURRENT_TIMESTAMP"];
    
    [self.dataBase executeStatements:searchSql12 withResultBlock:^int(NSDictionary *resultsDictionary) {
        
        NSLog(@"%@",resultsDictionary);
        return 0;
    }];

获取部分数据 LIMIT

sqlite> SELECT * FROM COMPANY LIMIT 3 OFFSET 2;

    // 2开始,取3个
    NSString *limitSql = [NSString stringWithFormat:@"SELECT * FROM %@ LIMIT %zi OFFSET %zi",tableName, 3,2];
    

排序 ORDER BY

获取的数据进行排序,对表本身没有变化

SELECT * FROM COMPANY ORDER BY SALARY ASC;// DESC

    NSString *orderSql = [NSString stringWithFormat:@"SELECT * FROM %@ ORDER BY %@ ASC",tableName, nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger age = [re intForColumn:@"age"];
        NSInteger iid = [re intForColumn:@"id"];
        NSLog(@"%zi :::%@ - %zi",iid,name, age);
    }
    [re close];

分组(计算流水总额) GROUP BY

数据表内是不同人的,花费流水,使用group,对name合并,计算SUM(cost)总额

SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;

    NSString *orderSql = [NSString stringWithFormat:@"SELECT name, SUM(cost) FROM %@ GROUP BY %@",tableName, nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger cost = [re intForColumn:@"SUM(cost)"];
        NSLog(@"%@ - %zi",name, cost);
    }
    [re close];

WHERE 子句上的二次过滤语句 HAVING

    NSString *orderSql = [NSString stringWithFormat:@"SELECT name, SUM(age) FROM %@ GROUP BY %@ HAVING COUNT(name) > 2 ORDER BY %@ ASC",tableName, nameKey,nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger sumage = [re intForColumn:@"SUM(age)"];
        NSLog(@":::%@ - %zi",name, sumage);
    }
    [re close];

去重复数据 DISTINCT

SELECT DISTINCT name FROM COMPANY;

    NSString *orderSql = [NSString stringWithFormat:@"SELECT Distinct name FROM %@",tableName];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSLog(@":::%@ - ",name);
    }
    [re close];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容