zoukankan      html  css  js  c++  java
  • iOS---数据离线缓存

    离线缓存

    • 为了用户的体验,不需要每次打开App都加载新数据,或者重新请求数据,因此需要把每次浏览的数据保存起来,当下次打开软件时,首先从沙盒中加载数据;或者当软件未联网时,也只能从沙盒中加载旧数据。

    离线数据的方法选择

    • 1.plist文件
    • 2.Document路径
    • 3.数据库
    由于保存的是大批量数据,且会不停的刷新新数据,因此应该选择数据库来存储。

    离线缓存的思路

    • 当第一次打开应用程序时,把界面加载好的数据保存到沙盒中
    • 当下一次进入应用程序时,首先从沙盒中找
      • 如果没有网络,直接加载上次保存的数据,或者没有比较新的数据也从沙盒中加载数据。

    需要缓存的数据如何保存

    • sqlite3 框架FMDB

    操作数据库的工具类

    static FMDatabase *_db;
    + (void)initialize
    {
        // 1.打开数据库
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"statuses.sqlite"];
        _db = [FMDatabase databaseWithPath:path];
        [_db open];
        
        // 2.创表
        // 表中有三列,一个是主键,另一个是数据对象的id,一个是数据对象
        [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_status (id integer PRIMARY KEY, status blob NOT NULL, idstr text NOT NULL);"];
    }
    
    保存到沙盒中得数据库中
    + (void)saveStatuses:(NSArray *)statuses
    {
    	// statuses是字典数组
        // 要将一个对象存进数据库的blob字段,最好先转为NSData
        // 一个对象要遵守NSCoding协议,实现协议中相应的方法,才能转成NSData
        for (NSDictionary *status in statuses) {
            // NSDictionary --> NSData
            NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:status];
            [_db executeUpdateWithFormat:@"INSERT INTO t_status(status, idstr) VALUES (%@, %@);", statusData, status[@"idstr"]];
        }
    }
    
    从数据库中取出缓存数据
    + (NSArray *)statusesWithParams:(NSDictionary *)params
    {
        // 根据请求参数生成对应的查询SQL语句
        NSString *sql = nil;
        // params[@"since_id"] 上拉刷新的标识
        if (params[@"since_id"]) {
            sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr > %@ ORDER BY idstr DESC LIMIT 20;", params[@"since_id"]];
        } else if (params[@"max_id"]) { // 下拉刷新
            sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr <= %@ ORDER BY idstr DESC LIMIT 20;", params[@"max_id"]];
        } else { // 第一次加载的时候
            sql = @"SELECT * FROM t_status ORDER BY idstr DESC LIMIT 20;";
        }
        
        // 执行SQL
        FMResultSet *set = [_db executeQuery:sql];
        NSMutableArray *statuses = [NSMutableArray array];
        while (set.next) {
            NSData *statusData = [set objectForColumnName:@"status"];
            NSDictionary *status = [NSKeyedUnarchiver unarchiveObjectWithData:statusData];
            [statuses addObject:status];
        }
        return statuses;
    }
    
  • 相关阅读:
    CSS 使DIV居中
    jsonlib 使用 转换JSON
    jquery autocomplete 自动完成 使用
    Sql server 实用技巧总结
    MvcHtml.DropDownList()用法
    日期时间正则表达式
    ASP.NET使用log4Net日志组件教程(每天产生一个日志及日志按大小切割)
    MvcHtml.ActionLink()用法
    给学弟的bitset使用整理
    2021 CCPC 广州站
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/4820700.html
Copyright © 2011-2022 走看看