数据本地化存储之NSUserdefaults,plist文件,归档解档,数据库sqlite(FMDB)

来源:互联网 发布:笔电锋淘宝 编辑:程序博客网 时间:2024/06/05 05:10

数据本地化存储

一.文件 sandbox

NSHomeDirectory();

二.plist 属性文件

Plist本质上是一个xml文件,来保存我们的数据

-------------写入plist--------------

  1. NSArray *array ;
  2. [array writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>];
  3. NSDictionary *dic;
  4. [dic writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>];
  5. NSData *data;
  6. [data writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>];

----------从plist中读取--------------

  1. [NSArray arrayWithContentsOfFile:<#(NSString *)#>];
  2. [NSDictionary dictionaryWithContentsOfFile:<#(NSString *)#>];
  3. [NSData dataWithContentsOfFile:<#(NSString *)#>];

三.NSKeyedArchive 归档

针对自定义的对象使用本地化存储,需要使用NSKeyedArchiver
NSKeyedArchiver 来归档我们自己的对象,要求对象遵循NSCoding协议

//针对每一个属性进行编解码,如果内部还有自定义对象,需要对该对象继续编解码

归档时(序列化)编码调用

  1. - (void)encodeWithCoder:(NSCoder *)aCoder
  2. {
  3.     //注意: 如果本类继承自另外一个自定义的类,需要调用[super encodeWithCoder:aCoder]
  4.     //[super encodeWithCoder:aCoder];
  5.     //encode 编码成支持的格式,譬如NSString ,NSNumber等
  6.     [aCoder encodeObject:@(self.age)   forKey:@"age"];
  7.     [aCoder encodeObject:self.name     forKey:@"name"];
  8. }


//解码,反归档

  1. - (id)initWithCoder:(NSCoder *)aDecoder{
  2.     //注意:  如果父类也需要进行编码反编码,需要调用super 方法
  3. //    if (self = [super initWithCoder:aDecoder]) {
  4. //        <#statements#>
  5. //    }
  6.     if (self = [super init]) {
  7.         self.age      = [[aDecoder decodeObjectForKey:@"age"] intValue];
  8.         self.name     = [aDecoder decodeObjectForKey:@"name"];
  9.     }
  10.     return self;
  11. }

-------------归档--------------

  1. NSString *archivePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/archive.plist"];
  2.   [NSKeyedArchiver archiveRootObject:array toFile:archivePath];

-------------解档--------------

  1. NSString *archivePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/archive.plist"];
  2. NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];

四.NSUserdefaults  沙盒/Library/Preferences /文件名

NSUserDefaults 是本地化存储的技术之一,通常只存储简单数据
譬如用户名,密码,滚动条的滚动位置,一些简单的设置等
能够存储的数据类型NSString,NSData,NSDate(日期),NSArray,NSDictionary,NSNumber,NSURL

key和object对应关系,把对象写到本地文件,以后可以通过key,再把对象取出

     ----------存入--------------

  1. [[NSUserDefaults standardUserDefaults] setObject:testObject forKey:@"testObjectKey"];

    注意:使用NSUserDefault时,不会马上把数据同步到本地文件,如果需要马上保存,调用同步方法
    [[NSUserDefaults standardUserDefaults] synchronize];

  ----------读取--------------

  1.  NSArray *objectArray = [[NSUserDefaults standardUserDefaults]objectForKey:@"testObjectKey"];

    注意:NSUserDefault使用plist文件,保存我们的数据,plist文件放在sandbox下的Library/Preferences/bundleId.plist

五.数据库  sqlite

     需求: 需要保存大量的数据
    解决: 如果使用json,xml或plist可以存储, 但是这样做性能太差, 一般情况下存储的时候选用数据库存储

    应用场合:        
                (1)交规考试---保存交通规则,使用数据库
                (2)保存用户的收藏记录, 浏览记录, 下载记录

    常用数据库:  SQLServer 2000-----保存游戏的所有用户的信息
                        Oracle
                        mysql------网上php网站使用较多  Linux Apach MySql PHP
                          
                        特点: 网络数据库, 支持的功能多, 程序比较大

    移动开发常用:    sqlite数据库

    特点:    足够小, 足够快(本地数据库), 使用比较简单
    作用: 增删改查  sql语句

    常用软件:                   SQLiteManager数据库操作软件
    数据库操作语言:        SQL(结构化查询语言)
    常用开源库:               FMDB

数据库本身就是一个文件,数据库中,可以有多张表table或者一张表  这个表就是一个二维的,有行,有列,
列称为字段,他和数据模型中的属性对应,行表示的就是一个数据模型对象的信息

 SQLiteManager 使用     链接:点击打开链接


        1.创建数据库

        2.创建表(一个数据库中存在多个表, xls文件中存在多个表格)

        3.添加字段  -- 设计表格的结构

        4.添加数据

        5.删除数据

        6.更新数据

        7.查询操作

SQL语法

        1.创建一个表格
        CREATE TABLE IF NOT EXISTS 表名 (
                serial INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
                sid Varchar(32) DEFAULT NULL,
                username Varchar(32) DEFAULT NULL,
                password Varchar(32),Expand)


            drop table testtable    删除表格

   INTEGER              整数类型
   FLOAT                   浮点
   VARCHAR(255)    字符串类型,只能接受255字符
   TEXT                          字符串类型,接收的字符个数没限制
   BLOB                        二进制数据 ,譬如把图片的内容可以存放为BLOB类型
   Date                        日期

if not exists          当表不存在的时候创建
primary key         主键,可以唯一表示一条记录(一行数据)
autoincrement     自增的
not  nil                 不能等于空
varchar(255)  是字符串类型,最多接受255个字符
DEFAULT           指定默认值

        2. 插入数据(核心和重点)-insert

            insert into user(sid,username,password) values('1410001','xiaohong','123')

            insert  into Persons(LastName,FirstName,Address,City) values ("德华","刘","China","北京");

也可以这样写:10表示sid,不可少

            insert  into Persons values (10,"德华","刘","China","北京");

        3. 查询数据(核心和重点) - select

            <1>查询表格中所有字段的数据
                select * from user

                //     *: 通配符,代表要所有列的字段

            <2>查询指定的字段
                实例: 获取所有用户名
                select username from user
                select username,password from user

            <3>根据指定的条件进行查询  - where
                实例:  sid为1410001人的信息获取出来
                select * from user where sid='1410001'

                  //where 后跟的是条件语句,= > <   like
    
            <4>根据多个条件进行查询
                实例:  判断用户名为lisi,密码为123456的用户是否存在?
                select * from user where username='lisi'and password='123456'

            <5>查询后需要排序-----淘宝查询按照价格排序,desc表示降序,默认升序
                select * from user order by sid desc

            <6>获取数据行数
                select count(*) from user

          //得到表user 中有多少行

        4. 删除数据
            实例:  删除用户名为hanmeimei 的所有行
                delete from user where username='hanmeimei'

        5.更新数据
            实例: 用户名为lisi的密码改为123456
                update user set password='123456' where username='lisi'


//从user表中查找从索引2开始的数两个的记录
select * from  user limit 2 ,2


查找 user 中的所有记录 按照 age 降序排列,默认升序
select * from user  order by age desc


查找 age=10的所有记录   按照 passwd 升序 排列
select * from user  where age=10  order by passwd asc

查找 age 分别 是 2   3   5 的所有记录
select * from user where age in (2,3,5)

查找 age  在2<=age <= 5 区间的所有记录
select * from user where age between  2 and 5

模糊找到 找到 username 中包含 xiaohong字符串的所有记录
select * from user where username like '%xiaohong%'

查找 指定范围的记录     limit 1,2  表示 从索引 1开始 数两条记录
//索引值数字 是从0开始表示
select * from user  limit 1,2

select sum(age) from user
select avg(age) from user

FMDB开源库

操作 sqlite 的一个第三库

增删改查

        使用库:
            (1)导入文件, 直接拖进来
            (2)添加系统库  libsqlite3.dylib
            (3)添加头文件
                #import "FMDatabase.h"
            fmdb  有 arc 和非arc 的代码

        如果是非arc 的代码在arc 环境下编译 要 混编 -fno-objc-arc

          下面只要调用相应的方法就可以了

          是不是很简单啊,动起来吧!

大家还有什么疑问可以给我留言哦!

小编定会知无不言,言无不尽滴!

欢迎大家关注我的微博哦!

0 0