数据存储梳理记录

news2024/11/22 19:06:28

目录

    • 1、FMDB-第三方SQLite数据库框架
      • 1.1 现状
      • 1.2 线程安全问题
        • 1.2.1 FMDatabase
        • 1.2.2 FMDatabaseQueue
        • 1.2.3 FMDatabasePool
    • 2、进程间通信
      • 2.1 URL Scheme
      • 2.2 keyChain
      • 2.3 UIPasteboard
      • 2.4 UIDocumentInteractionController
      • 2.5 local socket
      • 2.6 AirDrop
      • 2.7 UIActivityViewController
      • 2.8 App Groups
      • 3、实例分析
        • 3.1 代码段
        • 3.2 数据库
        • 3.3 基本操作
        • 3.4 存储文件路径

1、FMDB-第三方SQLite数据库框架

1.1 现状

目前项目中采用的是是FMDatabase实例化一个对象,缺点是只适合在单线程per thread中使用,在多线程下是不安全的。在使用过程需要用大量的代码拼接SQL、拼装Object。
现有项目数据库存储使用的是FMDB。
(1)文件系统数据库:指定一个文件系统路径,FMDB会尝试打开该文件。如果文件不存在,会创建该文件。
(2)临时数据库:指定一个空字符串@“”,FMDB会创建一个临时数据库。当FMDatabase实例关闭连接,就自动删除该数据库。
(3)内存数据库:当用户不指定数据库路径,FMDB会在内存中创建一个数据。当FMDataBase关闭连接,该数据库会被自动销毁。

1.2 线程安全问题

多线程环境下应该使用FMDatabaseQueue对象替代,以保证数据库的安全访问。

在这里插入图片描述

1.2.1 FMDatabase

一个对象对应一个sqlite,自己持有并保证进行单线程操作。

1.2.2 FMDatabaseQueue

多线程环境下应该使用FMDatabaseQueue对象替代,以保证数据库的安全访问。
1、把对应的操作封装成block的形式添加到一个serial的线程队列中,以保证所有异步添加进来的数据库操作都会在serial队列中按顺序执行,保证多线程环境下的数据安全。执行操作主要是通过serial queue的dispatch_sync()同步操作API完成的,这样就避免了访问数据时异步操作的可能性,从而保证多线程下的安全访问。
2、虽然多个block都是放到同一个队列里,但是其实是跑在不同的thread里,只要把block放到合适的队列里,GCD就会完成线程的创建,分配与回收。同一个队列可以对应多个thread。
3、FMDatabaseQueue可以多线程访问,但是都是使用同一个FMDatabase对象,保证同时只有一个线程持有FMDatabase对象,排起队来一个一个访问操作。
在这里插入图片描述

1.2.3 FMDatabasePool

FMDatabasePool,不同线程使用同一个FMDatabasePool对象,而使用不同的FMDatabase对象来进行数据库操作,后续研究下再补充。

2、进程间通信

由于沙箱运行,iOS内不同应用之间高度隔离,一些IPC方法,例如管道、邮槽、共享内存、Socket用不了。

2.1 URL Scheme

URL Call的处理函数,参数url是传进的url sourceApplication是呼叫应用的bundle identifier,通过此参数,应用可以对呼叫的应用进行过滤。annotation是呼叫过程中可以附加的额外参数。

  • (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    }
    如教师派下的支付,在教师派中,使用的应用调用协议是URL Schema,教师派可以声明自定义的调用协议,当支付宝或者微信打算在应用内打开教师派时,可以打开使用教师派自定义的协议开头的URL来打开教师派,除了协议头,URL中还可以附加其他参数。在app内加载网页内支付,去微信zf,支付完返回app时刷新网页
    使用URL Scheme,同一时刻只能有一个进程在前台,主动呼叫的应用在调用成功后必须进入后台,所以能传递的只有URL中所带的参数或annotation中所带的参数,调用的过程中会出现应用之间的切换。

2.2 keyChain

keyChain是一个sqlite数据库,里面的所有数据都是经过加密的。Keychain的信息是存在于每个应用(app)的沙盒之外的。app的信息保存在keyChain中,即使app删除,keyChain里的数据也不会删除,因此可以用于同一账户的多平台登录。例如交易ID、积分在银行和教师下的数据是可以保存下来的。
这个数据是存在系统的,所以就算卸载软件,也照样存在机器中,除非恢复系统。每个ios程序都有一个独立的keychain存储。
用于储存一些私密信息,比如密码、证书等等,Keychain里保存的信息不会因App被删除而丢失,在用户重新安装App后依然有效。
同样也适用于应用之间数据共享。KeyChain相当于是一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。

2.3 UIPasteboard

多个app之间,是可以共享剪贴板里的数据的
从剪贴板里写入和读取数据

2.4 UIDocumentInteractionController

实现app中文档共享

2.5 local socket

这种方式不太常见,也是很容易被iOS开发者所忽略但是特别实用的一种方法。它的原理很简单,一个App1在本地的端口port1234进行TCP的bind和listen,另外一个App2在同一个端口port1234发起TCP的connect连接,这样就可以建立正常的TCP连接,进行TCP通信了,那么就想传什么数据就可以传什么数据了。
这种方式最大的特点就是灵活,只要连接保持着,随时都可以传任何相传的数据,而且带宽足够大。它的缺点就是因为iOS系统在任意时刻只有一个app在前台运行,那么就要通信的另外一方具备在后台运行的权限,像导航或者音乐类app。

它是常用使用场景就是某个App1具有特殊的能力,比如能够跟硬件进行通信,在硬件上处理相关数据。而App2则没有这个能力,但是它能给App1提供相关的数据,这样APP2跟App1建立本地socket连接,传输数据到App1,然后App1在把数据传给硬件进行处理。

2.6 AirDrop

2.7 UIActivityViewController

2.8 App Groups

App Group用于同一个开发团队开发的App之间,包括App和Extension之间共享同一份读写空间,进行数据共享。同一个团队开发的多个应用之间如果能直接数据共享,大大提高用户体验。

3、实例分析

3.1 代码段

(BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
// <iOS9.0
KGLog(@"++++ %@ %@", url, sourceApplication);
//在app内加载网页内支付,去微信zf,支付完返回app时刷新网页
if ([url.absoluteString isEqualToString:KGWXWebReferer]) {
[[NSNotificationCenter defaultCenter] postNotificationName:KGSaleWXToAPPNotification object:nil];
return YES;
}
if ([url.absoluteString hasPrefix:@"jiaoshipai"]) {
[[KGWebOpenAppTool shareInstance] handleOpenURL:url];
return YES;
} 

//    BOOL canHandleURL = [Pingpp handleOpenURL:url withCompletion:nil];

if ([[KGPKit defaultManager] handleOpenURL:url]) {
    return YES;
}

return NO;

}

3.2 数据库

1、lessonTime数据库
数据表及字段(教师、银行、综合)
1、seektime(课程ID、视频ID、这节课看的总时间)
在这里插入图片描述
2、time()
在这里插入图片描述

3.3 基本操作

教师/银行
1、建表,seektime(观看时间),time(本地观看数据)
2、提交本地观看数据
3、保存观看时间
4、获取上次的观看时间,继续看

综合
1、建表,seektime(观看时间),字段包含课程ID、视频ID、这节课看的总时间
2、保存观看时间
3、获取上次的观看时间,继续看
4、获取某classid下最近学习的vid(KGLookVideoData-%@.plist),显示“最近学习”

3.4 存储文件路径

沙盒地址:KGLessonTimeDataBasePath = /var/mobile/Containers/Data/Application/XXXXXXXXXXXX/Documents/lessonTime.db

在这里插入图片描述
1、Document:持久的数据
2、Library:设置程序的默认设置和其他状态信息
3、temp:临时文件的目录,当iOS设备重启时,文件会被自动清除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blender 建模小飞机(基础着色、Cycles渲染引擎)

目录 1. 飞机建模1.1 机身1.2 机身表面细分1.3 机翼1.4 尾翼1.5 尾翼镜像1.6 涡轮1.7 添加经纬球1.8 螺旋桨1.9 螺旋桨调整1.10 柱子1.11 柱子镜像1.12 起落架1.13 轮胎1.14 管1.15 镜像1.16 调整飞机角度 2. 着色 渲染2.1 添加地面2.2 飞机着色2.3 其他材质着色2.4 环境纹理2.…

JSDoc 拥抱 Javascript

JSDoc 在 vs code 已经内置了. 可以在 js 文件的开头添加 // ts-check 即可. 在注释中标注来实现一些 ts 的功能. JSDoc 支持以下注解. Types typeparam (or arg or argument)returns (or return)typedefcallbacktemplate Classes Property Modifiers public, private, p…

Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

大家好&#xff0c;我是煎鱼。 之前写过一篇关于 Go WebAssembly 的相关文章 《一分钟搞明白&#xff01;快速掌握 Go WebAssembly》&#xff0c;今天带来一则新消息。 想着 Go 过去了那么多年了&#xff0c;只在 Go1.11 支持了 WebAssembly1.0 的部分功能&#xff08;js/sysca…

一个实际音视频开发问题!

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题&#xff0c;比如说&#xff1a; 解码播放的时候&#xff0c;播不出来解码播放的时候&#xff0c;画面有条纹编码的时候&#xff0c;修改分辨率大小&#xff0c;没有反应 这三…

深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战

近几年植入式脑机接口技术取得了非常显著的进步&#xff0c;从工程实现能力和服务功能场景来说&#xff0c;脑机接口技术已经达到了临床应用的临界点&#xff0c;在实验室科研成果向临床医疗器械转化过程中将会面临新的挑战。本文章由此出发&#xff0c;首先介绍了脑机接口技术…

工程监测无线中继采集仪的常用功能与设置

工程监测无线中继采集仪的常用功能与设置 LoRA 频道与中心频率 无线中继采集发送仪使用频道来设置不同的射频中心频率。 中心频率 MHz 基频 (频道) &#xff0c;无线中继采集发送仪 的 LoRA 基频已设置为 420 或者 854MHz&#xff0c;可以使用$STRFxxx 重新设置基频。 例如&a…

RT-Thread 1. GD32移植RT-Thread Nano

1. RT-Thread Nano 下载 RT-Thread Nano 是一个极简版的硬实时内核&#xff0c;它是由 C 语言开发&#xff0c;采用面向对象的编程思维&#xff0c;具有良好的代码风格&#xff0c;是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小&#xff0c;功能包括任务处理…

Ansys Zemax | 设计抬头显示器时要使用哪些工具 – 第三部分

本文为使用OpticStudio工具设计优化HUD抬头显示器系统的第三部分&#xff0c;主要包含演示了如何使用OpticStudio非序列模式工具正向分析HUD系统的性能以及后续可能的扩展分析。 上两篇文章中(第一部分点此查看&#xff0c;第二部分点此查看)&#xff0c;我们主要介绍了如何以逆…

js 定时去重复显示和隐藏的思路

文章目录 思路一 每秒执行思路二 直接用定时器&#xff0c;但是不每秒思路三 es9 异步迭代异步迭代例子1 直接使用例子2 async await例子3 * yield异步遍历器 --》要想用for await of 必须遍历这个简化 for await of解决1秒出现第一个结果&#xff0c;再过2秒出现第二个&#x…

电脑录屏软件哪个好用?3款屏幕录制大师分享!

案例&#xff1a;如何快速录制电脑屏幕&#xff1f; 【每次录制电脑屏幕都要花费我很多时间&#xff0c;十分影响我工作的效率。有没有什么方法可以帮助我实现电脑快速录屏&#xff1f;蹲一款好用的电脑录屏软件!】 电脑录屏是我们在工作或学习中常常需要使用到的功能&#x…

Swagger介绍及Springboot整合Swagger避坑

Swagger简介 前后端分离 vueSpringboot 后端时代&#xff1a;前端之管理静态页面&#xff0c;html>后端。模板引擎 JSP>后端是主力 前后端分离时代&#xff1a; 后端&#xff1a;后端控制层、服务层、数据访问层【后端团队】前端&#xff1a;前端控制层、视图层【前端…

网易云音乐开发--recommendSong搭建

recommendSong页面头部静态搭建 先新建一个 recommendSong 修改上面的nav部分 写上面的样式。我们现在写在这个框里面放个日期 就是让这个文字基于父元素垂直水平居中 样式搞定 recommendSong日期动态显示 之前我们将recommendSong静态头部做好了&#xff0c;现在我们需…

Springboot idea 中 maven配置问题,找不到依赖:Could not find artifact xxxx

现象&#xff1a;当我们从代码仓拉取新项目时&#xff0c;从该项目的开发同事拿到其maven的settings文件&#xff0c;作为项目的maven配置&#xff0c;为了是能找到工程中所依赖的包&#xff0c;能从远程仓下载下来。 然后本地仓的包&#xff0c;也从同事那边拷贝一份过来&…

二叉搜索树详解及代码实现

目录 一、什么是二叉搜索树 二、二叉搜索树的有关操作 2.1 查找&#xff1a; 2.2插入&#xff1a; 2.3 删除&#xff1a; 2.4 打印 三、二叉搜索树的应用 3.1 K模型&#xff1a; 3.2 KV模型&#xff1a; 四、整体代码&#xff1a; K模型&#xff1a; KV模型&#xff…

物联网应用普及正在改变我们的生活

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;指的是通过互联网连接各种物品、设备和传感器&#xff0c;实现物品之间的互联互通&#xff0c;形成智能化、自动化的数据交互和服务体系。简单来说&#xff0c;就是将各类物品通过互联网连接&#xff0c;实现互…

小心!YouTube官方邮件恐是网络钓鱼

在最近的一条推文中&#xff0c;YouTube披露了有关新的网络钓鱼诈骗的详细信息&#xff0c;并呼吁用户小心“no-replyyoutube.com”发送的信件。该骗局一直在使用真实的no-replyyoutube.com电子邮件地址来引诱用户泄露他们的登录凭据。那么这种新的网络钓鱼是如何运作的呢&…

原神QQ机器人BOT搭建教程Ubuntu系统

原神QQ机器人BOT搭建教程Ubuntu系统 大家好我是艾西&#xff0c;今天跟大家分享的是YUAN神qi鹅群机器人bot搭建方式以及详细的操作步骤。跟上艾西的节奏准备发车啦&#xff01; 前言&#xff1a;&#xff08;xxxx即为xxxx&#xff09;&#xff08;zzz即为zzz&#xff09; qi…

【池化技术】基于Apache组件--对象池的介绍与使用

文章目录 一、背景二、对象池有什么特征&#xff1f;三、池的大小选择四、运行原理五、对象管理5.1添加对象5.2借用对象5.3归还对象5.4对象状态 六、对象池的使用6.1 接入6.2 实现线程池工厂6.3 初始化 七、优缺点八、应用场景8.1Redis应用8.2 Web服务器例子8.3 游戏开发种的例…

论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究

本论文相关内容 论文下载地址——Web Of Science论文中文翻译——How Double-Fetch Situations turn into Double-Fetch Vulnerabilities A Study of Double Fetches in the Linux Kernel 文章目录 本论文相关内容前言Double-Fetch情况如何演变为Double-Fetch漏洞&#xff1a;…

Elasticsearch:如何使用 Elasticsearch 以自然语言提示 ChatGPT

作者&#xff1a;Enrico Zimuel 这些天每个人都在谈论 ChatGPT。 这种大型语言模型 (LLM) 的一项很酷的功能是能够生成代码。 我们用它来生成 Elasticsearch DSL 查询。 目标是在 Elasticsearch 中搜索 “给我股票指数中 2017 年的前 10 个文档&#xff08;Give me the first 1…