iOS数据持久化存储(3)-- SQLite

iOS数据持久化就是把数据存在文件中永久保存,数据持久化保存的几种方式:

1、plist文件(适合小型数据)

2、归档Archieve(适合小型数据)

3、NSUserDefaults(适合小型数据)

4、SQLite数据库(适合大型数据)

5、Core Data数据库(适合大型数据)

6、普通文件NSFileManager/NSFileHandle(适合任何类型数据)


一、数据库介绍

1、数据库(Database/DB)是一种某种数据模型组织起来并 存放存储管理的数据仓库。

2、数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。

3、数据库操作是对数据的增、删、改、查。由统一数据库软件来进行管理和控制。

4、常见的服务器数据库有:Access、Oracle、Microsoft SQL Server、DB2、Mysql。

二、SQLite数据库

1、SQLite是一款嵌入式的轻量关系型文件数据库,是遵守ACID的关系型数据库管理系统。

2、SQLite数据库所有内容存放在一个文件中,一个数据库就是一个文件。

3、SQLite占用资源很少,适合小型手机设备使用。

4、SQLite是几乎所有手机系统(iOS、Android、Symbian、Blackberry、Lumia、Limo等)的标准数据库。

三、SQLite语句

1、创建/删除表格

iOS数据持久化存储(3)-- SQLite_第1张图片

2、增删改查

四、SQLite数据类型

1、整数数据类型

integer:  整型数据,大小为4个字节。

bigint:  整型数据,大小为8个字节。

smallint:  整型数据,大小为2个字节。

tinyint:  从0到255的整型数据,大小为1个字节。

float:  4字节浮点数。

double:  8字节浮点数。

real:  8字节浮点数。

2、字符串数据类型

char(n) :n长度的字符串,n不能超过254。

varchar(n) :长度不固定且其最大长度为n的字符串,n不能超过4000。

text :text存储可变长度的非Unicode数据,存更大的字符串。

3、日期类型

date:包含年、月、日。

time:包含时、分、秒。

datetime:包含年、月、日、时、分、秒。格式‘2012-01-01’。

timestamp:包含年、月、日、时、分、秒、千分之一秒。

4、其它类型

null:空值

blob:二进制对象

default:缺省值

primary key:主键

autoincrement:主键自动增长


五、FMDB介绍

FMDB是一个开源的第三方操作数据库的框架,支持ARC和Non-ARC/MRC操作,它是对iOS官方提供操作数据库方法的封装,使用更加方便。导入头文件后别忘了添加系统库  libsqlite3.dylib哦。

下面博主给出一个demo,我们具体来看看FMDB是如何实现创建数据库、创建表以及对数据的增删改查的。

/*
 1.创建数据库(open)
 2.创建表(不存在则创建)
 3.增删改查
 */

#import "DataBaseManager.h"
#import <FMDB.h>

@implementation DataBaseManager
{
    FMDatabase *_database;
}

#pragmaamrk -- 非标准单例

+ (instancetype)defaultManager {
    static DataBaseManager * manager = nil;
    @synchronized(self) {
        if (manager == nil) {
            manager = [[self alloc] init];
        }
    }
    return manager;
}

#pragmamark -- 单例初始化的时候创建数据库
- (instancetype)init {
    if (self = [super init]) {
        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *dataPath = [docPath stringByAppendingPathComponent:@"stu.sqlite"];
        _database = [[FMDatabase alloc] initWithPath:dataPath];
        if (![_database open]) {
            NSLog(@"open error:%@",_database.lastErrorMessage);
        }else {
            [self createTable];
        }
    }
    return self;
}


#pragma mark - 创建表
- (void)createTable {
    NSString *sql = @"CREATE TABLE IF NOT EXISTS stu (serial integer  Primary Key Autoincrement,uid Varchar(256) DEFAULT NULL, name Varchar(256),score Double,headimage blob)";
    if (![_database executeUpdate:sql]) {
        NSLog(@"create table error:%@",_database.lastErrorMessage);
    }
}


#pragma mark - 增加
- (void)insertDataWithModel:(StudentModel *)model {
    if ([self isExistDataWithUid:model.uid]) {
        NSLog(@"该记录已经增加");
        return;
    }
    
    NSString *sql = @"insert into stu(uid,name,score,headimage) values (?,?,?,?)";
    if (![_database executeUpdate:sql,model.uid,model.name,@(model.score),model.headimage]) {
        NSLog(@"insert error:%@",_database.lastErrorMessage);
    }
}

#pragma mark - 删除
- (void)deleteDataWithUid:(NSString *)uid {
    NSString *sql = @"delete from stu where uid=?";
    if (![_database executeUpdate:sql,uid]) {
        NSLog(@"delete error:%@",_database.lastErrorMessage);
    }
}

#pragma mark - 修改
- (void)updateDataWithUid:(NSString *)uid newModel:(StudentModel *)newModel {
    NSString *sql = @"update stu set name=?,score=?,headimage=? where uid=?";
    if (![_database executeUpdate:sql,newModel.name,@(newModel.score),newModel.headimage,uid]) {
        NSLog(@"update error:%@",_database.lastErrorMessage);
    }
}

#pragma mark - 根据uid查找
- (BOOL)isExistDataWithUid:(NSString *)uid {
    NSString *sql = @"select * from stu where uid=?";
    FMResultSet *rs = [_database executeQuery:sql,uid];
    if ([rs next]) {
        return YES;
    }
    return NO;
}

#pragma mark - 查找
- (NSArray *)fetchAllData {
    NSString *sql = @"select * from stu";
    FMResultSet *rs = [_database executeQuery:sql];
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    while ([rs next]) {
        StudentModel *model = [[StudentModel alloc] init];
        model.uid = [rs stringForColumn:@"uid"];
        model.name = [rs stringForColumn:@"name"];
        model.score = [rs doubleForColumn:@"score"];
        model.headimage = [rs dataForColumn:@"headimage"];
        [arr addObject:model];
    }
    return arr ;
}

#pragma mark - 查询有多少条记录
- (NSInteger)countOfData {
    NSString *sql = @"select count(*) from stu";
    FMResultSet *rs = [_database executeQuery:sql];
    while ([rs next]) {
        return [rs longForColumnIndex:0];
    }
    return 0;
}

@end


奋斗如果帮到了你,要记得分享哦奋斗



你可能感兴趣的:(sql,数据,存储,ios开发)