IOS开发学习笔记之数据存储

++ 数据存储++
ios中常用的持久化数据的方法:
1、属性列表:Xcode的Property List;再序列化到文件中,使用NSString、NSArray或NSDirectory等的writeToFile方法;主要用于解决硬编码问题;
2、对象归档
3、SQLite3:
4、Core Data:是一种ORM技术;本质上是通过sqlite或二进制文件、内存形式来存储;
[另外还包括C语言的I/O调用;Cocoa的底层文件管理工具。]

对象归档
Applications目录:
Documents:应用数据存储在Documents中,但基于NSUserDefaults的首先项除外;
Library:基于NSUserDefaults的首选项设置存储在Library/Preferences文件夹中;
tmp:供应用存储临时文件。

 //返回Documents的路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"Document path is %@",paths[0]);
    //获取temp的路径
    NSString *temPath = NSTemporaryDirectory();
    NSLog(@"temp path is %@",temPath);

归档(archiving):是指另一种形式的序列化,是任何对象都可以实现的更常规的类型。必须遵循NSCoding协议(类似java中的Serializable);
同NSCopying

//实现NSCoding的方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        _age = [aDecoder decodeIntegerForKey:kAgeKey];
    }
    return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeInteger:_age forKey:kAgeKey];
}

存档归档操作:

 //归档存储
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //存入数据
    [archiver encodeObject:myObj forKey:@"keyString"];
    //进行提交
    [archiver finishEncoding];
    //写入到文件系统
    BOOL success = [data writeToFile:path atomically:YES];
    /*******从存档中读取数据重组对象***********/
    NSData *readData = [[NSData alloc] initWithContentsOfFile:path];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:readData];
    //读取数据
    obj = [unarchiver decodeObjectForKey:@"keyString"];
    //告知归档程序完成
    [unarchiver finishDecoding];

+SQLite3+
ios已提供了ORM(对象关系映射)的解决方案:Core Data;
导入头文件#import

 sqlite3 *database;
    int result = sqlite3_open("/path/to/database", &database);
    if (result == SQLITE_OK) {
        //数据库打开成功
        char *errorMsg;
        const char *createSQL = "create table if not exists Student(ID INTEGER PRIMARY KEY AUTOINCREMENT,msg TEXT)";
        int excResult = sqlite3_exec(database, createSQL, NULL, NULL, &errorMsg);
        if (excResult == SQLITE_OK) {
            //执行sql成功
        }else{
            //执行sql失败
        }
        NSString *query = @"select ID,msg from Student order by ID";
        sqlite3_stmt *statement;
        //查询到statement中
        sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil);
        //遍历结果集
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int rowNum = sqlite3_column_int(statement, 0);
            char *rowData = (char *)sqlite3_column_text(statement, 1);
            //转成OC的数据模型
            NSString *msg = [NSString stringWithUTF8String:rowData];
        }
        //标识查询遍历完成
        sqlite3_finalize(statement);
        //绑定变量操作
        char *insertSql = "insert into Student values(?,?)";
        sqlite3_stmt *insertStmt;
        if (sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, nil)==SQLITE_OK) {
            //预处理成功,对指定的字段绑定值
            //第一个问题对应的值设为235
            sqlite3_bind_int(insertStmt, 1, 235);
            //对第二个?对应的值设为Good Student;-1可直接代替Good Student的长度。最后一个参数一个函数,用于做一些在语句执行完成后做一些清理操作,一般是使用malloc使用一些清理操作
            sqlite3_bind_text(insertStmt, 2, "Good Student", -1, NULL);
        }
        if (sqlite3_step(insertStmt)==SQLITE_DONE) {
            //用表示SQLITE_DONE数据更新成功
        }
    }
    //使用完成后关闭数据库
    sqlite3_close(database);

[注意:在C语言中,若两个内联的字符串之间只有空白(包括换行符)而没有其他字符,那么这两个字符串会被连接到一起,故一般使用NSString 后再转换成C下的字符串]
【在需要频繁使用数据库时,可能有必要始终打开连接】

+Core data +
是苹果的一款稳定、功能全面的持久化工具;是一种包装了sql操作的可视化工具;内部是使用sqlite持久化数据,但不需要写sql语句,只需要操作对象,由内部的Core data完成;
数据存储在Document目录下;
【但除使用sqlite保存外也可指定使用二进制文件或内存形式来存储】
New File -> Data Model,生成一个.xcdatamodel文件;该文件包含我们的数据模型。可用于直观的设计数据模型而无需编写代码,并将数据模型存储在.xcdatamodel文件中;不需要创建类,而是先在数据模型编辑器中直接创建实体,然后在代码中为这些实体创建托管对象;
实体的3个属性:
特性(attribute):与实例变量在OC类中的作用是完全相同的,都用于保存数据;
关系(relationship):实体间的对应关系,如外键关联等;
提取属性(fetched property):是关系的一个备选方法,可创建一个可在提取时被评估的查询,从而确定哪些对象属于这个关系。通常是一对一的关系;也是唯一一种能跨越多个数据存储的关系;
操作:
NSManagedObjectModel:被管理对象模型,是系统中的实体,与数据库中的表等对象相对应;
NSManagedObjectContext:被管理对象上下文,可查找、删除和插入对象,然后再同步到持久化存储中;
NSPersistentStoreCoordinator:持久化存储协调器;在持久化对象上提供了一个接口可认为是与数据库的连接;

博客地址:IOS开发学习笔记之数据存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值