数据持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,我们一般使用以下方式持久化数据:1、plist文件(属性列表);2、preference(偏好设置NSUserDefaults);3、SQLite 3 (第三方FMDB);
1、plist文件:
将某些特定的类,通过XML文件的方式保存在目录中。在iOS开发中通常用来存储用户设置,还可以用于存储程序中经常用到而不经常改动的数据。
只有下面的类型才能使用plist文件存储:NSArray;NSString;NSNumber;NSDictionary;NSDate;NSData;
NSMutableDictionary;NSMutableData;NSMutableString;NSMutableArray;
//1、获得文件路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [path stringByAppendingPathComponent:@"test.plist"];
//2、存储
NSArray *array = @[@"123", @"456", @"789"];
[array writeToFile:fileName atomically:YES];
//3、读取
NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
NSLog(@"%@", result);
2、preference(偏好设置):(NSUserDefaults)
使用偏好设置存储是一个方便快捷的方法,偏好设置的实质就是在底层封装了一个字典,生成的是一个plist文件,保存在libary-perferences这个目录下面。使用偏好设置的好处有两个:1.不需要关心文件名2.快捷做键值对存储。
//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中写入内容
[userDefaults setObject:username forKey:@"username"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:20 forKey:@"age"];
//立即同步
[userDefaults synchronize];
//3.读取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@, %d, %ld", name, sex, age);
3、SQLite3
上面两种存储方法,都是覆盖存储。如果想要增加一条数据就必须把整个文件读出来,然后修改数据后再把整个内容覆盖写入文件。所以它们都不适合存储大量的内容。
表面上SQLite将数据分为以下几种类型:integer : 整数;real : 实数(浮点数);text : 文本字符串;blob : 二进制数据,比如文件,图片之类的。实际上SQLite是无类型的。即不管你在创表时指定的字段类型是什么,存储是依然可以存储任意类型的数据。而且在创表时也可以不指定字段类型。SQLite之所以什么类型就是为了良好的编程规范和方便开发人员交流,所以平时在使用时最好设置正确的字段类型!主键必须设置成integer
在iOS中要使用SQLite3,需要添加库文件:libsqlite3.dylib并导入主头文件,这是一个C语言的库,所以直接使用SQLite3还是比较麻烦的。不过一般开发过程中,使用的都是第三方开源库 FMDB,封装了这些基本的c语言方法,使得我们在使用时更加容易理解,提高开发效率。
FMDB是iOS平台的SQLite数据库框架,它是以OC的方式封装了SQLite的C语言API,它相对于cocoa自带的C语言框架有如下的优点:1、使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码。2、对比Core Data框架,更加轻量级和灵活。3、提供了多线程安全的数据库操作方法,有效地防止数据混乱。
FMDB有三个主要的类:1、FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句。2、FMResultSet:使用FMDatabase执行查询后的结果集。3、FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的。
FMDB通过指定SQLite数据库文件路径来创建FMDatabase对象,使用之前一样需要导入sqlite3.dylib。
打开数据库方法:
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"student.db"];
FMDatabase *database = [FMDatabase databaseWithPath:path];
if (![database open]) {
NSLog(@"数据库打开失败!");
}
更新(executeUpdate):
//常用方法有以下3种:
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
//示例
[database executeUpdate:@"CREATE TABLE IF NOT EXISTS table_student(id integer primary key autoincrement, name text, age integer)"];
查询(executeQuery):
//常用方法有以下3种:
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
//查询示例
//1.执行查询
FMResultSet *result = [database executeQuery:@"SELECT * FROM table_student"];
//2.遍历结果集
while ([result next]) {
NSString *name = [result stringForColumn:@"name"];
int age = [result intForColumn:@"age"];
}