//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{
//打开成功创建表
}
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
-(BOOL)creatTable{
//创建表的SQL语句
//用户 表
NSString *creatUserTable = @"CREATE TABLE IF NOT EXISTS 't_User' (
'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
'name' TEXT,
'age' INTEGER,
'icon' TEXT);";
//车 表
NSString *creatCarTable = @"CREATE TABLE IF NOT EXISTS 't_Car' (
'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
'type' TEXT,
'output' REAL,
'master' TEXT);";
//项目中一般不会只有一个表
NSArray *SQL_ARR = [NSArray arrayWithObjects:creatUserTable,creatCarTable, nil];
return [self creatTableExecSQL:SQL_ARR];
}
-(BOOL)creatTableExecSQL:(NSArray *)SQL_ARR{
for (NSString *SQL in SQL_ARR) {
//参数一:数据库对象 参数二:需要执行的SQL语句 其余参数不需要处理
if (![self execSQL:SQL]) {
return NO;
}
}
return YES;
}
#pragma 执行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;
}
}
DROP TABLE database_name.table_name;
假设变量a=10,变量b=20,则:
== 检查两个操作数的值是否相等,如果相等则条件为真。 (a == b) 不为真。
= 检查两个操作数的值是否相等,如果相等则条件为真。 (a = b) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (a != b) 为真。
<> 检查两个操作数的值是否相等,如果不相等则条件为真。 (a <> b) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (a > b) 不为真。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (a >= 检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。 (a >= b) 不为真。
<= 检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。 (a <= b) 为真。
!<检查左操作数的值是否不小于右操作数的值,如果是则条件为真。 (a !!> 检查左操作数的值是否不大于右操作数的值,如果是则条件为真。 (a !> b) 为真。
选择年龄等于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
下面的 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 以 &#8216;Ki&#8217; 开始的所有记录,&#8217;Ki&#8217; 之后的字符不做限制:
SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';
下面的 SELECT 语句列出了 NAME 以 &#8216;Ki&#8217; 开始的所有记录,&#8217;Ki&#8217; 之后的字符不做限制:
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 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;
}
}
带有 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;
带有 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;
}
}
SQLite 的 SELECT 语句的基本语法如下:
SELECT column1, column2, columnN FROM table_name;
在这里,column1, column2&#8230;是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法
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
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;
}
下面一些实例演示了 带有 &#8216;%&#8217; 和 &#8216;_&#8217; 运算符的 LIKE 子句不同的地方:
您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。在这里,XXXX 可以是任何数字或字符串值。
查找年龄包含8的所有用户
+ (NSArray *)likeUser {
NSString *sql = @"SELECT * FROM 't_User' WHERE AGE LIKE '%8%'";
return [self querySQL:sql];
}
SQLite 的 GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。
星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。
下面一些实例演示了 带有 &#8216;*&#8217; 和 &#8216;?&#8217; 运算符的 GLOB 子句不同的地方:
您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。在这里,XXXX 可以是任何数字或字符串值。
查找年龄包含8的所有用户
+ (NSArray *)likeUser {
NSString *sql = @"SELECT * FROM 't_User' WHERE AGE GLOB '*8*'";
return [self querySQL:sql];
}
带有 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 子句的基本语法如下:
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 子句必须放在 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 子句必须放在 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 关键字的基本语法如下:
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
用户重名的只获取一次
SELECT DISTINCT name FROM COMPANY;