iOS sqlite3数据库

2018-05-23  本文已影响0人  宇宙高哥

简介

SQLite 命令

SQLite数据类型

SQLite亲和类型

创建数据库

//app内数据库文件存放路径-一般存放在沙盒中
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *DBPath = [documentPath stringByAppendingPathComponent:@"appDB.sqlite"];
//创建(指定路径不存在数据库文件)/打开(已存在数据库文件) 数据库文件
//sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)  filename:数据库路径  ppDb:数据库对象
if (sqlite3_open(DBPath.UTF8String, &_db) != SQLITE_OK) {
    //数据库打开失败
}else{
    //打开成功创建表
}

创建表

删除表

DROP TABLE database_name.table_name;

SQLite运算符

算数运算符

比较运算符

假设变量a=10,变量b=20,则:

==   检查两个操作数的值是否相等,如果相等则条件为真。           (a == b) 不为真。
=    检查两个操作数的值是否相等,如果相等则条件为真。           (a = b) 不为真。
!=   检查两个操作数的值是否相等,如果不相等则条件为真。         (a != b) 为真。
<>   检查两个操作数的值是否相等,如果不相等则条件为真。          (a <> b) 为真。
>    检查左操作数的值是否大于右操作数的值,如果是则条件为真。   (a > b) 不为真。
<    检查左操作数的值是否小于右操作数的值,如果是则条件为真。   (a < b) 为真。
>=   检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。 (a >= b) 不为真。
<=   检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。 (a <= b) 为真。
!<   检查左操作数的值是否不小于右操作数的值,如果是则条件为真。  (a !< b) 为假。
!>   检查左操作数的值是否不大于右操作数的值,如果是则条件为真。  (a !> b) 为真。

SQLite表达式

布尔表达式

选择年龄等于18的用户

SELECT * FROM 't_User' WHERE SALARY = 18;

数值表达式

这些表达式用来执行查询中的任何数学运算。语法如下:

SELECT numerical_expression as  OPERATION_NAME
[FROM table_name WHERE CONDITION] ;

在这里,numerical_expression 用于数学表达式或任何公式。下面的实例演示了 SQLite 数值表达式的用法:

SELECT (15 + 6) AS ADDITION
ADDITION = 21

有几个内置的函数,比如 avg()、sum()、count(),等等,执行被称为对一个表或一个特定的表列的汇总数据计算。

sqlite> SELECT COUNT(*) AS "RECORDS" FROM COMPANY; 
RECORDS = 7

Where子句

下面的 SELECT 语句列出了 AGE 大于等于 25 且工资大于等于 65000.00 的所有记录:

SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;

下面的 SELECT 语句列出了 AGE 大于等于 25 或工资大于等于 65000.00 的所有记录:

SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;

下面的 SELECT 语句列出了 AGE 不为 NULL 的所有记录,结果显示所有的记录,意味着没有一个记录的 AGE 等于 NULL:

SELECT * FROM COMPANY WHERE AGE IS NOT NULL;

下面的 SELECT 语句列出了 NAME 以 'Ki' 开始的所有记录,'Ki' 之后的字符不做限制:

SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';

下面的 SELECT 语句列出了 NAME 以 'Ki' 开始的所有记录,'Ki' 之后的字符不做限制:

SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';

下面的 SELECT 语句列出了 AGE 的值为 25 或 27 的所有记录:

SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );

下面的 SELECT 语句列出了 AGE 的值既不是 25 也不是 27 的所有记录:

SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );

下面的 SELECT 语句列出了 AGE 的值在 25 与 27 之间的所有记录:

SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;

Insert语句(增)

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

iOS代码

-(BOOL)insertSelfToDB{
//插入对象的SQL语句
NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO 't_User' (name,age,icon) VALUES ('%@',%ld,'%@');",self.name,self.age,self.icon];
return [self execSQL:insertSQL];
}

-(BOOL)execSQL:(NSString *)SQL{
char *error;
if (sqlite3_exec(self.db, SQL.UTF8String, nil, nil, &error) == SQLITE_OK) {
    return YES;
}else{
    NSLog(@"SQLiteManager执行SQL语句出错:%s",error);
    return NO;
}
}

Delete(删)

带有 WHERE 子句的 DELETE 查询的基本语法如下:

DELETE FROM table_name
WHERE [condition];

删除年龄大于18的人员

+ (void)deleteUser {
NSString *sql = @"DELETE FROM 't_User' WHERE AGE > 18";
[self execSQL:sql];
}

-(BOOL)execSQL:(NSString *)SQL{
char *error;
if (sqlite3_exec(self.db, SQL.UTF8String, nil, nil, &error) == SQLITE_OK) {
    return YES;
}else{
    NSLog(@"SQLiteManager执行SQL语句出错:%s",error);
    return NO;
}
}

如果您想要从 COMPANY 表中删除所有记录,则不需要使用 WHERE 子句,DELETE 查询如下:

DELETE FROM COMPANY;

Update(改)

带有 WHERE 子句的 UPDATE 查询的基本语法如下:

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

把ID为6的用户的年龄改为17,姓名改为chai

+ (void)updateUser {
NSString *sql = @"UPDATE 't_User' SET AGE = 17, NAME = 'chai' WHERE ID = 6";
[self execSQL:sql];
}
-(BOOL)execSQL:(NSString *)SQL{
char *error;
if (sqlite3_exec(self.db, SQL.UTF8String, nil, nil, &error) == SQLITE_OK) {
    return YES;
}else{
    NSLog(@"SQLiteManager执行SQL语句出错:%s",error);
    return NO;
}
}

Select(查)

SQLite 的 SELECT 语句的基本语法如下:

SELECT column1, column2, columnN FROM table_name;

在这里,column1, column2...是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法

SELECT * FROM table_name;

iOS代码,读取年龄大于18的

-(BOOL)selectUser{
//插入对象的SQL语句
NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM 't_User' WHERE AGE > 18];
return [self querySQL:insertSQL];
}

#pragma mark - 查询数据库中数据
-(NSArray *)querySQL:(NSString *)SQL{
//准备查询
// 1> 参数一:数据库对象
// 2> 参数二:查询语句
// 3> 参数三:查询语句的长度:-1
// 4> 参数四:句柄(游标对象)
//    sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
sqlite3_stmt *stmt = nil;
if (sqlite3_prepare_v2(self.db, SQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
    NSLog(@"准备查询失败!");
    return NULL;
}
//准备成功,开始查询数据
//定义一个存放数据字典的可变数组
NSMutableArray *dictArrM = [[NSMutableArray alloc] init];
while (sqlite3_step(stmt) == SQLITE_ROW) {
    //一共获取表中所有列数(字段数)
    int columnCount = sqlite3_column_count(stmt);
    //定义存放字段数据的字典
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    for (int i = 0; i < columnCount; i++) {
        // 取出i位置列的字段名,作为字典的键key
        const char *cKey = sqlite3_column_name(stmt, i);
        NSString *key = [NSString stringWithUTF8String:cKey];
        
        //取出i位置存储的值,作为字典的值value
        const char *cValue = (const char *)sqlite3_column_text(stmt, i);
        NSString *value = [NSString stringWithUTF8String:cValue];
        
        //将此行数据 中此字段中key和value包装成 字典
        [dict setObject:value forKey:key];
    }
    [dictArrM addObject:dict];
}
return dictArrM;
}

Like 子句

查找年龄包含8的所有用户

+ (NSArray *)likeUser {
NSString *sql = @"SELECT * FROM 't_User' WHERE AGE LIKE '%8%'";
return [self querySQL:sql];
}

Glob 子句

查找年龄包含8的所有用户

+ (NSArray *)likeUser {
NSString *sql = @"SELECT * FROM 't_User' WHERE AGE GLOB '*8*'";
return [self querySQL:sql];
}

Limit 子句

带有 LIMIT 子句的 SELECT 语句的基本语法如下:

SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows]

下面是 LIMIT 子句与 OFFSET 子句一起使用时的语法:

SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows] OFFSET [row num]

从表中提取6行

+ (NSArray *)limitUser {
NSString *sql = @"SELECT * FROM 't_User' LIMIT 6";
return [[SQLiteManager shareInstance] querySQL:sql];
}

获取从第三个位置开始提取3个记录

+ (NSArray *)limitUser {
NSString *sql = @"SELECT * FROM 't_User' LIMIT 3 OFFSET 3";
return [[SQLiteManager shareInstance] querySQL:sql];
}

Order By(排序)

ORDER BY 子句的基本语法如下:

SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

用户按年龄升序排列

+ (NSArray *)orderByAge; {
NSString *sql = @"SELECT * FROM 't_User' ORDER BY AGE ASC";
return [self querySQL:sql];
}

在年龄大于18的用户中按姓名和年龄升序排列

+ (NSArray *)orderByAge; {
NSString *sql = @"SELECT * FROM 't_User' WHERE AGE > 18 ORDER BY NAME, AGE ASC";
return [self querySQL:sql];
}

Group By

下面给出了 GROUP BY 子句的基本语法。GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前。

SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN 

如果您想了解每个客户的工资总额,则可使用 GROUP BY 查询,如下所示:

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

获取每个用户的工资总额.并按姓名降序排列

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

Having 子句

在一个查询中,HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前。下面是包含 HAVING 子句的 SELECT 语句的语法:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

下面是一个实例,它将显示名称计数小于 2 的所有记录:

SELECT * FROM COMPANY GROUP BY name HAVING count(name) < 2;

Distinct 关键字

用于消除重复记录的 DISTINCT 关键字的基本语法如下:

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name
WHERE [condition]

用户重名的只获取一次

SELECT DISTINCT name FROM COMPANY;
上一篇 下一篇

猜你喜欢

热点阅读