betway必威手机版 > betway必威手机版 > iOS本地数据存取

原标题:iOS本地数据存取

浏览次数:107 时间:2020-03-18

图片 1输出结果

char *sql = "insert into t_person(name, age) values;";sqlite3_stmt *stmt;if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL); sqlite3_bind_int(stmt, 2, 27);}if (sqlite3_step != SQLITE_DONE) { NSLog(@"插入数据错误");}sqlite3_finalize;
  • 设若目标是NSString、NSDictionary、NSArray、NSData、NSNumber等项目,能够直接用NSKeyedArchiver进行归档和回复
  • 不是具有的指标都得以直接用这种艺术开展归档,唯有据守了NSCoding合同的对象技术够
  • NSCoding协议有2个方法:
    • encodeWithCoder:每回归档对象时,都会调用这几个方法。日常在此个法子里面钦赐怎么样归档对象中的种种实例变量,还行encodeObject:forKey:方法归档实例变量
    • initWithCoder:每趟从文件中恢复生机对象时,都会调用那些法子。平日在这里个法子里面钦赐怎么样解码文件中的数据为对象的实例变量,还行decodeObject:forKey方法解码实例变量
  • 遍历数据
NSEntityDescription *desc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
  • SQLite3常用的5种数据类型:text、integer、float、boolean、blob
  • 在iOS中运用SQLite3,首先要增加库文件libsqlite3.dylib和导入主头文件

    图片 2导入库

  • 成立或展开数据库

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];request.sortDescriptors = [NSArray arrayWithObject:sort];

图片 3运作结果

图片 4

NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];[NSKeyedArchiver archiveRootObject:array toFile:path];
  • 各种iOS应用都有投机的施用沙盒(应用沙盒就是文件系统目录State of Qatar,与此外文件系统隔开分离。应用必得待在投机的沙盒里,其余应用不能够采访该沙盒

  • 利用沙盒的文件系统目录,如下图所示(若是应用的称号叫Layer)

    图片 5行使沙盒的文件系统目录

  • 接纳沙盒结构解析

    • 应用程序包:(上海体育场合中的Layer卡塔尔满含了具备的能源文件和可试行文件

    • Documents:保存应用运营时生成的急需长久化的数目,iTunes同步设备时会备份该目录。举例,游戏使用可将游戏存档保存在该目录

    • tmp:保存应用运行时所需的临时数据,使用落成后再将相应的文件从该目录删除。应用尚未运转时,系统也是有可能会免去该目录下的文本。iTunes同步设备时不会备份该目录

    • Library/Caches:保存应用运维时生成的内需长久化的多少,iTunes同步设备时不会备份该目录。常常存款和储蓄体量大、不须要备份的非首要数据

    • Library/Preference:保存应用的具有偏疼设置,iOS的Settings应用会在该目录中追寻应用的设置新闻。iTunes同步设备时会备份该目录

  • 运用沙盒目录的科学普及遍得到取方式

    • 沙盒根目录:NSString *home = NSHomeDirectory();

    • Documents:

      • 应用沙盒根目录拼接”Documents”字符串
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];context.persistentStoreCoordinator = psc;// 用完之后,还是要[context release];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

- 如果父类也遵守了NSCoding协议,请注意: - 应该在encodeWithCoder:方法中加上一句 [super encodeWithCode:encode]; 确保继承的实例变量也能被编码,即也能被归档 - 应该在initWithCoder:方法中加上一句 self = [super initWithCoder:decoder]; 确保继承的实例变量也能被解码,即也能被恢复
// 临时存储person1的数据NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];// 解析data,生成一个新的Person对象Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];// 分别打印内存地址NSLog(@"person1:0x%x", person1); // person1:0x7177a60NSLog(@"person2:0x%x", person2); // person2:0x7177cf0
  • 盛传模型,开始化NSPersistentStoreCoordinator

图片 6文本编辑器查看

NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];
NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];[card setValue:@"4414241933432" forKey:@"no"];
// path为:~/Documents/person.dbsqlite3 *db;int result = sqlite3_open([path UTF8String], &db);
  • 归档成功

    图片 7存档文件

  • 恢复NSArray对象

  • Person.h
- tmp:NSString *tmp = NSTemporaryDirectory();- Library/Caches:(跟Documents类似的2种方法) - 利用沙盒根目录拼接”Caches”字符串 - 利用NSSearchPathForDirectoriesInDomains函数(将函数的第1个参数改为:NSCachesDirectory即可)- Library/Preference:通过NSUserDefaults类存取该目录下的设置信息

NSString *home = NSHomeDirectory();NSString *documents = [home stringByAppendingPathComponent:@"Documents"];// 不提议选拔,因为新本子的操作系统或然会校勘目录名```

char *errorMsg; // 用来存储错误信息char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);
  • 安装规范过滤(name like '%hosea-1%'卡塔尔(قطر‎
  • Person.m
  • 丰硕长久化存款和储蓄库,这里运用SQLite作为存款和储蓄库
  • 安装要查询的实体
  • 初叶化三个查询诉求
  • Core Data框架提供了指标-关系映射的成效,即能够将OC对象转造成数据,保存在SQLite3数据库文件中,也能够将保留在数据库中的数据恢复成OC对象。在此数量操作时期,不须要编制任何SQL语句。使用此意义,要增添CoreData.framework和导入主头文件CoreData/CoreData.h图片 8指标-关系映射
  • 在Core Data,要求展开映射的靶子称为实体,何况亟需选取Core Data的模子文件来呈报应用的具有实体和实体性质
  • 此处以Person和卡德2个实体为例子,先看看实体性质和里面包车型客车涉嫌关系

    图片 9实业性质和之间的关系关系

    • Person中有个Card属性,Card中有个Person属性
    • 归属万分双向关系

<h2 >XML属性列表归档</h2>

// 新建一块可变数据区NSMutableData *data = [NSMutableData data];// 将数据区连接到一个NSKeyedArchiver对象NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];// 开始存档对象,存档的数据都会存储到NSMutableData中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];// 存档完毕(一定要调用这个方法,调用了这个方法,archiver才会将encode的数据存储到NSMutableData中)[archiver finishEncoding];// 将存档的数据写入文件[data writeToFile:path atomically:YES];

图片 10

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
  • 特性列表是一种XML格式的文本,拓宽名称为plist

  • 要是指标是NSStringNSDictionaryNSArrayNSDataNSNumber等品种,就能够动用writeToFile:atomically:艺术直接将目的写到属性列表文件中

  • 举个例证

    • 将三个NSDictionary对象归档到贰个plist属性列表中
  • PS:也可将三个对象放入到贰个数组中。
    • 将数组实行归档,在数组对象施行archiveRootObject:toFile时,数组中种种对象会自行调用encodeWithCoder:方法实行归档;
    • 反而数组文件举行解档时,在数组对象实施unarchiveObjectWithFile:时,数组中各样对象会自行调用initWithCoder:方法举办解档。
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
// 从文件中读取数据NSData *data = [NSData dataWithContentsOfFile:path];// 根据数据,解析成一个NSKeyedUnarchiver对象NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *person1 = [unarchiver decodeObjectForKey:@"person1"];Person *person2 = [unarchiver decodeObjectForKey:@"person2"];// 恢复完毕(这个方法调用之后,unarchiver不能再decode对象,而且会通知unarchiver的代理调用unarchiverWillFinish:和unarchiverDidFinish:方法)[unarchiver finishDecoding];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"itcast" forKey:@"username"];[defaults setFloat:18.0f forKey:@"text_size"];[defaults setBool:YES forKey:@"auto_login"];
@interface Person : NSObject<NSCoding>@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@property (nonatomic, assign) float height;@end
  • 透过Core Data从数据库抽取的对象,暗许情状下都以NSManagedObject对象
  • NSManagedObject的做事形式有一点点近似于NSDictionary对象,通过键-值对来存取全体的实体性质

    • setValue:forKey: 存款和储蓄属性值
    • valueForKey: 获取属性值

      图片 11

图片 12xcode查看- 读取属性列表,复苏NSDictionary对象

  • 品质列表-NSDictionary的积累和读取进程

    图片 13质量列表-NSDictionary的仓库储存和读取进程

    <h2 >Preference</h2>

  • 很多iOS应用都支持偏幸设置,比方保留客户名、密码、字体大小等装置,iOS提供了一套规范的缓和方案来为使用步向偏心设置功用

  • 各类应用都有个NSUserDefaults实例,通过它来存取偏爱设置

  • 比方说,保存客户名、字体大小、是还是不是自动登入

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];person.name = @"hosea";person.age = [NSNumber numberWithInt:22];Card *card = [NSEntityDescription insertNewObjectForEntityForName:@”Card" inManagedObjectContext:context];card.no = @”4414245465656";person.card = card;
  • 流传上下文,创造三个Card实体对象
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
  • 诸如对二个Person对象进行深复制

<h2 >NSKeyedArchiver归档</h2>

  • 安装轻易属性
  • 进行央求
``` objc
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];
  • Core Data不会依赖实体中的关联关系即刻收获相应的涉嫌对象
  • 诸如通过Core Data抽出Person实体时,并不会立即询问相关联的Card实体;当使用真的必要选拔Card时,才会查询数据库,加载Card实体的音讯
  • 代码拆解解析
    • sqlite3_step()返回SQLITE_ROW代表遍历到一条新记录
    • sqlite3_column_*(卡塔尔国用于获取各类字段对应的值,第四个参数是字段的目录,从0发轫
@implementation Person- encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.name forKey:@"name"]; [encoder encodeInt:self.age forKey:@"age"]; [encoder encodeFloat:self.height forKey:@"height"];}- initWithCoder:(NSCoder *)decoder { self.name = [decoder decodeObjectForKey:@"name"]; self.age = [decoder decodeIntForKey:@"age"]; self.height = [decoder decodeFloatForKey:@"height"]; return self;}@end
  • 举个例证:NSData-归档2个Person对象到同一文件中
  • 归档
  • 设置排序

图片 14原理

  • 开始化上下文,设置persistentStoreCoordinator属性
NSError *error = nil;NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];if (store == nil) { // 直接抛异常 [NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription]];}

用文件编辑器张开,文件内容为:

// 将数据封装成字典NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"母鸡" forKey:@"name"];[dict setObject:@"15013141314" forKey:@"phone"];[dict setObject:@"27" forKey:@"age"];// 将字典长久化到Documents/stu.plist文件中[dict writeToFile:path atomically:YES];

  1. XML属性列表归档
  2. Preference
  3. NSKeyedArchiver归档
  4. SQLite3
  5. Core Data
for (NSManagedObject *obj in objs) { NSLog(@"name=%@", [obj valueForKey:@"name"]);}

传入需要删除的实体对象[context deleteObject:managedObject];将结果同步到数据库NSError *error = nil;[context save:&error];if  { [NSException raise:@"删除错误" format:@"%@", [error localizedDescription]];}
  • 创制文件

    图片 15

  • 增进实体

    图片 16此地写图片描述

  • 增添Person实体的主干天性

    图片 17

  • 增加Card实体的骨干质量

    图片 18

  • 在Person中添加card属性

    图片 19

  • 在Card中添加person属性

    图片 20

  • 创设SQLite文件路线
 - 利用NSSearchPathForDirectoriesInDomains函数 ``` objc

// 读取Documents/stu.plist的内容,实例化NSDictionaryNSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];NSLog(@"name:%@", [dict objectForKey:@"name"]);NSLog(@"phone:%@", [dict objectForKey:@"phone"]);NSLog(@"age:%@", [dict objectForKey:@"age"]);

  • 设置Person和Card之间的关联关系
char *sql = "select id,name,age from t_person;";sqlite3_stmt *stmt;if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) { while (sqlite3_step == SQLITE_ROW) { int _id = sqlite3_column_int; char *_name = sqlite3_column_text; NSString *name = [NSString stringWithUTF8String:_name]; int _age = sqlite3_column_int; NSLog(@"id=%i, name=%@, age=%i", _id, name, _age); }}sqlite3_finalize;
  • 默许处境下,利用Core Data抽取的实业都是NSManagedObject类型的,能够利用键-值对来存取数据
  • 只是日常景色下,实体在存取数据的根基上,有的时候还供给加上一些作业方法来成功部分任何任务,那么就非得创设NSManagedObject的子类

    图片 21

  • 选料模型文件

    图片 22

  • 选取须求创建子类的实体

    图片 23图片 24

  • 那么生成七个Person实体对象就应当如此写

// NSUserDomainMask 代表从客户文件夹下找// YES 代表实行路线中的波浪字符“~”NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES卡塔尔(قطر‎;// 在iOS中,独有叁个索引跟传播的参数相称,所以那个群集里面唯有三个因素NSString *documents = [array objectAtIndex:0];```

 create table t_person(name, age);

图片 25储存文件内容

  • SQLite3是一款开源的嵌入式关系型数据库,可移植性好、易使用、内部存款和储蓄器开支小
  • SQLite3是无类型的,意味着你能够保留任何类型的数据到自便表的妄动字段中。比方下列的创表语句是合法的:
NSError *error = nil;BOOL success = [context save:&error];if  { [NSException raise:@"访问数据库错误" format:@"%@", [error localizedDescription]];}// 如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库
  • 动用上下文对象,将数据同步到悠久化存储库

<h2 >Core Data</h2>

Person *person = [[[Person alloc] init] autorelease];person.name = @"hosea";person.age = 22;person.height = 1.83f;[NSKeyedArchiver archiveRootObject:person toFile:path];
NSError *error = nil;NSArray *objs = [context executeFetchRequest:request error:&error];if  { [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];}
  • 恢复

图片 26存取进程

用xcode展开属性文件:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*hosea-1*"];request.predicate = predicate;

<h2 >SQLite3</h2>

 create table t_person(name text, age integer);
  • 代码剖析:
    • sqlite3_exec(卡塔尔(قطر‎可以举办此外SQL语句,举个例子创表、更新、插入和删除操作。不过平日不要它履行查询语句,因为它不会回到查询到的数码
    • sqlite3_exec(卡塔尔还足以实行的口舌:
      1. 张开事务:begin transaction;
      2. 回滚事务:rollback;
      3. 付给业务:commit;
```成功写入到Documents目录下:
  • 恢复
  • 代码剖判:

    • sqlite3_open(卡塔尔(قطر‎将依靠文件路线张开数据库,要是不设有,则会创立三个新的数据库。要是result等于常量SQLITE_OK,则代表成功张开数据库
    • sqlite3 *db:多少个张开的数据库实例
    • 数据库文件的门道必需以C字符串(而非NSString卡塔尔(قطر‎传入
  • 关门数据库:sqlite3_close;

  • 实行创表语句

为了保障可读性,提议依然把字段类型丰裕:

[person setValue:@"hosea" forKey:@"name"];[person setValue:[NSNumber numberWithInt:22] forKey:@"age"];
[person setValue:card forKey:@"card"];
  • 从应用程序包中加载模型文件
```
  • 运用archiveRootObject:toFile:方法能够将一个目的直接写入到叁个文本中,但神蹟恐怕想将多少个目的写入到同叁个文件中,那么快要动用NSData来拓宽归档对象

  • NSData可以为部分数额提供近期存款和储蓄空间,以便随后写入文件,可能贮存从磁盘读取的公文内容。可以选拔[NSMutableData data]开创可变多少空间

  • 归档
  • 传播上下文,创设叁个Person实体对象
  • 代码深入分析:
    • sqlite3_prepare_v2(State of Qatar重临值等于SQLITE_OK,说明SQL语句已经希图成功,没有语法难点
    • sqlite3_bind_text(卡塔尔(قطر‎:超过半数绑定函数都唯有3个参数
      1. 第3个参数是sqlite3_stmt *类型
      2. 第二个参数指占位符的职位,第一个占位符的地点是1,不是0
      3. 第2个参数指占位符要绑定的值
      4. 第2个参数指在第一个参数中所传递数据的长度,对于C字符串,可以传递-1替代字符串的尺寸
      5. 第5个参数是多少个可选的函数回调,经常用于在言语施行后达成内存清理专门的学问
    • sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功进行完毕
    • sqlite_finalize():销毁sqlite3_stmt *对象

图片 27深复制原理

本文由betway必威手机版发布于betway必威手机版,转载请注明出处:iOS本地数据存取

关键词: iOS 数据 就够了

上一篇:betway88必威体育的开发中iBeacon和BLE的区别,你应

下一篇:没有了