前言:一些简单的增删改查语句即可上手。可作缓存、收藏等。
一、FMDB的下载地址
https://github.com/ccgus/fmdb
导入libsqlite3.dylib依赖库文件 兼容ARC和MRC
总的思路: (1)得到沙盒路径
(2)创建数据库
(3)建表
(4)打开数据库
(5)对表进行增删改查工作(需要注意的是:增加的时候判断是否存在重复对象)
(6)关掉数据库
二、模拟场景
请求数据然后建立模型,将模型写入数据库,然后再从数据库读取出来。结合对象。
三、学习下SQL常用语句
1、建表
CREATE TABLE 表名字 (字段1 类型,字段2 类型,字段3 类型,…)
例如:CREATE TABLE people(form TEXT, time TEXT, content TEXT) 其中TEXT可理解未字符串类型
2、修改
UPDATE 表名 SET %@ = ‘%@’,%@ = ‘%@’ WHERE %@ = ‘%@’”
3、增
INSERT INTO 表名 (‘%@’, ‘%@’, ‘%@’) VALUES (‘%@’, ‘%@’, ‘%@’)
4、查(模糊查询和精确查询)
SELECT * from 表名
SELECT * FROM 表名 ORDER BY 字段
SELECT * FROM 表名 WHERE ename like ’ ’
四、开始代码的事项过程
1、创建数据库
(1)声明全局的数据数据库对象:FMDatabase *db;
(2)创建 db = [FMDatabase databaseWithPath:@”路径”]];
注意: 如果路径你传入的为空,那么fmdb会在临时文件目录下创建这个数据库,数据库断开连接时,数据库文件被删除;如果路径是null,那么会再内存中创建一个数据库,当断开连接时候,那么数据库会被删除。个人建议:路径为沙盒路径。
- (NSString *)databaseFilePath
{
NSArray *filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [filePath objectAtIndex:0];
NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@”db.sqlite”];
return dbFilePath;
}//沙盒路径
(3)判断数据库是否创建成功,很简单,看打开数据库能不能成功即可。
if (![db open]) {
NSLog(@"数据库打开失败!");
return;
}else{
NSLog(@"数据库打开成功!");
}
(4)建议设计数据库缓存策略,这样可以提高查找效率
db.shouldCacheStatements = YES;
2、数据库建表(表名为:people 字段有 time content)
if (![db tableExists:@”people”]) {
[db executeUpdate:@”CREATE TABLE people(form TEXT, time TEXT, content TEXT) “];
NSLog(@”表创建成功!”);
}else{
NSLog(@"表创建失败!");
}
如果数据库不存在名字为people的表,那么建立people的表,并有字段 form /time/content
注意: 这里的字段最好不要跟语句相冲突!! 还有就是,建表的前提是数据库打开。
3、增加和修改一起说。
要增加一条记录的前提,是数据库不存在重复的记录。那则为增加,如果数据库存在重复记录,那么则对该条记录的某个字段值进行修改。这里结合数据请求一起说。一张表的缓存。
(1)创建一个是否创建新的数据模型写入数据库的标志位:flag = NO;
从数组中取出重复对象的下标值 indexpath = 0;
(2)循环遍历数组中的所有对象(model)
for (int i = 0; i < tableview.data.count; i++) {
Model *model = tableview.data[i]; //取出数据模型
//如果存在重复,替代重复对象,取得下标
if ([text.userInfo[@”from”] isEqualToString:model.from]) {
flag = YES;
index = i;
}else{
//如果不存在,直接创建对象
}
// a.重复
if(flag){
// 取出模型
Model *model = _contractListView.data[index];
//打开数据库
if ([db open]){
NSString *updateSql = [NSString stringWithFormat:
@”UPDATE people SET %@ = ‘%@’,%@ = ‘%@’ WHERE %@ = ‘%@’”,
@”time”,[dateFormatterstringFromDate:date],
@”content”,text.userInfo[@”message”],
@”[form]”,model.from];
BOOL results = [db executeUpdate:updateSql];
if(results){
//修改成功
}else{
//修改失败
}
}
}
// b.如果不重复
if ([db open]) {
NSString *insert = [NSString stringWithFormat:
@”INSERT INTO people(‘%@’, ‘%@’, ‘%@’) VALUES (‘%@’, ‘%@’, ‘%@’)”,
@”form”, @”time”, @”content”,text.userInfo[@”from”], [dateFormatter stringFromDate:date], text.userInfo[@”message”]];
//执行插入语句
BOOL res = [db executeUpdate:insert];
if(res){
//插入成功
}else{
//插入失败
}
4、查(这个是现实数据,也就是为一张表赋值,刷新表)
NSMutableArray *array =[[NSMutableArray alloc]init];
FMResultSet results = [db executeQuery:@”select from people”];
while ([results next]) {
//增加模型
ContractManModel *model = [[ContractManModel alloc]init];
model.from = [results stringForColumn:@"form"];;
model.time = [results stringForColumn:@"time"];;
model.content = [results stringForColumn:@"content"];
[array addObject:model];
}
_contractListView.data = array;
[_contractListView reloadData];
}
5.删除(分为:分为物理删除和逻辑删除)
结合一张表的数据,那么当有点击删除一张表的数据时候,分成两部:①清除界面上的数据 ; ②清空数据库的数据。 前者是物理删除,后者是逻辑删除。
[tableview.data removeAllobjects];
[tableview reloadData];
// 2.逻辑删除
NSString * query = [NSString stringWithFormat:@”DELETE FROM chatHistory WHERE chatId = ‘%@’”,self.customServicePhone];
BOOL res = [_db executeUpdate:query];
if (res) {
NSLog(@"删除成功!");
}else{
NSLog(@"删除失败!");
}
注意的地方:
(1)数据库打开,必然要数据库关闭,open和close最好同步出现,养成好习惯。
(2)字段名的名字不要跟SQL语句的任何关键字有冲突或者形似。