1,打开数据库,不存在就会创建一个
sqlite3_open([[self getFilePath] UTF8String],&database)//如果返回值为`SQLITE_OK` 则打开数据库成功 ,否则失败
数据库的增删改查都是基于打开数据库成功的前提下进行sqlite3_exec
操作的
sqlite3_exec(database,[sqlStr UTF8String],NULL,NULL,nil)//如果返回值为SQLITE_OK,则操作成功,否则失败
,而且每一次操作结束后都要关闭数据库连接
sqlite3_close(database);//关闭数据库连接
2,创建一个数据表
CREATE TABLE 表名 (字段名1 字段类型,字段名2 字段类型,...... ), (字段名也就是列名)
其中字段类型有
(1).数据类型 :常用的有TEXT
(字符串,单引号或双引号来环绕文本值,如果是数值,则不需要使用引号),INTEGER
(整型),FLOAT/DOUBLE
(单/双精度浮点型),BOOLEAN
(布尔型),具体的可以Google一下sql中的数据类型
(2).PRIMARY KEY
主键,也是唯一的标识符
(3).AUTOINCREMENT
自动增长
(4).NOT NULL
非空
(5).UNIQUE
唯一的
(6).DEFAULT
给字段添加默认值约束
(7).FOREIGN KEY
外键,关联表
3.增加数据(插入数据)
(1)插入一行新数据,需要值和字段名对应添加
INSERT INTO 表名 (字段名1,字段名2,....)VALUES (值1,值2,....);
像下面这种方法是默认全部字段添加
INSERT INTO 表名 VALUES (值1,值2,...)
(2)给表添加新的一列 ,(并没有给每行赋值)
ALTER TABLE 表名 ADD 字段名 字段类型
4.删除数据
(1)根据WHERE条件删除
DELETE FROM 表名 WHERE 条件
其中条件运算符有 = ,>,>=,<,=< ,!=
(或者<>
),BETWEEN
(在某个范围内,前闭后闭),LIKE
(含有特定字符,用下划线_
代表一个任意字符,%代表任意一串字符),OR
相当于或,只需要一个条件成立, AND
,相当于且,需要全部条件成立
如:①查询含有x的字符串 like '%x%'
②查询第二位有x得字符串 like '_x%'
(2)删除表
DROP TABLE 表名
5.修改数据
UPDATE 表名 SET 字段名1 = 新值1,字段名2 = 新值2,...... WHERE 条件
6.查询数据
(1)根据条件查询
SELECT 字段名1,字段名2,...... FROM 表名 WHERE 条件
可以用 *
代表所有的字段名,进行整个表的查询:
SELECT * FROM 表名
数据库中提供了内置函数: MAX(
求最大值),MIN
(求最小值),AVG
(求平均值),SUM
(求和),
(2)根据指定的列,对结果集进行排序,默认按照升序:
SELECT 字段名 FROM 表名 ORDER BY 字段名 条件(DESC(降序) 或者 ASC(升序))
(3)查询不重复的数据
SELECT DISTINCT 字段名 FROM 表名
在对数据库进行增删改查时,需要用到对应格式的C语言字符串,
首先,将NSString
转换为 const char
的方法为 [sqlStr UTF8String]
, 将const char
转换为NSString
的方法有 [NSString stringWithUTF8String:cChar]
或者[[NSString alloc]initWithUTF8String:cChar]
然后,我们在动态进行操作时需要动态获取对应的值,这时我们的sql
语句就不是固定不变的了,需要动态改变,
7.动态操作的方法有:
(1)拼接字符串的方法
这种方法比较简单,将不变的和变化的通过[NSString stringWithFormat:]
方法拼接起来,就ok了
(2)使用 ? 作为值的占位符,然后准备语句,绑定数据.
具体步骤如下:
①创建操作语句,变化的值用?代替
比如
NSString * sqlStr = @"UPDATE contactTable SET name = ?,phoneNumber = ? WHERE contactID = ?";
②声明一个缓冲区
sqlite3_stmt * stmt = nil;
③准备语句,
sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil)
如果返回值为SQLITE_OK
则进行绑定操作,否则使用sqlite3_finalize(stmt);
来销毁前面被sqlite3_prepare
创建的准备语句,以防止内存泄露。
④绑定数据操作
sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 3, c.contactID);
⑤如果sqlite3_step(stmt)
返回值等于SQLITE_DONE
则表明操作成功.(在查询数据库操作中使用
while(sqlite3_step(stmt) == SQLITE_ROW){
//通过sqlite3_column_数据类型 来获取对应列(索引从0开始)的值
}
).
8.比较完整的代码
#pragma mark - 创建或打开数据库
- (BOOL)createDatabase{
if(sqlite3_open([getFilePath() UTF8String], &db) == SQLITE_OK){
NSLog(@"创建数据库或者打开数据库---成功");
return YES;
}else{
NSLog(@"创建数据库或者打开数据库---失败");
return NO;
}
}
#pragma mark - 创建表
- (void)createTable{
if ([self createDatabase]) {
NSLog(@"---------数据库打开成功");
NSString * sqlStr = @"CREATE TABLE IF NOT EXISTS contactTable (contactID INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,phoneNumber TEXT)";
if(sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, nil) == SQLITE_OK){
NSLog(@"创建表格成功");
}else{
NSLog(@"创建表格失败");
}
}else{
NSLog(@"---------数据库打开失败");
}
sqlite3_close(db);
}
#pragma mark - 插入数据到数据库
- (void)insertDataIntoDb:(Contact *)c{
if ([self createDatabase]) {
//1 拼接字符串
// NSString * sqlStr = @"INSERT INTO contactTable(name,phoneNumber) VALUES (";
// NSString * sql = [NSString stringWithFormat:@"%@%@,%@)",sqlStr,c.name,c.phoneNumber];
// if(sqlite3_exec(db, [sql UTF8String], NULL, NULL, nil) == SQLITE_OK){
// NSLog(@"数据插入成功");
// }else{
// NSLog(@"数据插入失败");
// }
//2 使用 ? 作为要插入值的占位符
NSString * sqlStr = @"INSERT INTO contactTable(name,phoneNUmber) VALUES (?,?)";
sqlite3_stmt * stmt = nil;//创建缓冲区
if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
//绑定要插入的数据
sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"*********插入数据成功");
}
}else{
sqlite3_finalize(stmt);
}
}
sqlite3_close(db);
}
#pragma mark - 从数据库中删除数据
- (void)deleteDataFromDb:(Contact *)c{
if ([self createDatabase]) {
NSString * sqlStr = @"DELETE FROM contactTable WHERE contactID = ";
NSString * sql = [NSString stringWithFormat:@"%@%d",sqlStr,c.contactID];
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, nil) == SQLITE_OK) {
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
}
sqlite3_close(db);
}
#pragma mark - 修改数据库中的数据
- (void)updateDataFromDb:(Contact *)c{
if ([self createDatabase]) {
NSString * sqlStr = @"UPDATE contactTable SET name = ?,phoneNumber = ? WHERE contactID = ?";
sqlite3_stmt * stmt = nil;
if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
//绑定要插入的数据
sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 3, c.contactID);
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"*********修改数据成功");
}
}else{
sqlite3_finalize(stmt);
}
}
sqlite3_close(db);
}
#pragma mark - 查询数据
- (NSMutableArray *)getAllContact{
NSMutableArray * array = [[NSMutableArray alloc]init];
if ([self createDatabase]) {
//打开数据库成功准备查询
NSString * sqlStr = @"SELECT * FROM contactTable";
sqlite3_stmt * stmt = nil;
if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
while (sqlite3_step(stmt) == SQLITE_ROW) {
int contactID = sqlite3_column_int(stmt, 0);
NSString * name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)] ;
NSString * phoneNumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];
Contact * c = [Contact createContactWithProperty:contactID name:name phoneNumber:phoneNumber]; //这是自定义类Contact(继承于NSObject)中的自定义方法,返回一个Contact类型的对象.Contact有3个属性 int contactID,NSString * name , *phoneNumber;
[array addObject:c];
}
}
}
return [array autorelease];
}