知乎日报第四周总结

这周基本完成了知乎日报的内容,主要写了点赞收藏的滑动刷新的保存,还有收藏文章的功能,主要用到FMDB库。

对于如何使用FMDB库

同样需要用cocopads引入FMDB库,使用时需要引入头文件

#import "FMDatabase.h"

FMDB库的使用类似于C语言的文件操作,需要我们手动创库,之后编译器会生成一个文件用于数据的存储,当程序关闭后,文件中的内容也不会消失,当程序重新启动后,会继续利用从而达到本地持久化。

FMDB的创建

- (void)dateBaseInit {NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString* filename = [collectionDoc stringByAppendingPathComponent:@"collection1.sqlite"];self.collectionDataBase = [FMDatabase databaseWithPath:filename];if ([self.collectionDataBase open]) {BOOL result = [self.collectionDataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS collectionData (mainLabel text NOT NULL, imageURL text NOT NULL, id text NOT NULL, url text NOT NULL);"];if (result) {NSLog(@"创表成功");} else {NSLog(@"创表失败");}}NSString *goodDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString * fileName = [goodDoc stringByAppendingPathComponent:@"likes.sqlite"];self.likesDataBase = [FMDatabase databaseWithPath:fileName];if ([self.likesDataBase open]) {BOOL result = [self.likesDataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS likesData (id text NOT NULL);"];if (result) {NSLog(@"创表成功");} else {NSLog(@"创表失败");}}
}

不必在意其何时创建的,只要在你用到它时创建好就行。在程序重新启动时,该段代码会在执行一遍,但不会创建一个新的库覆盖前面的,可以理解为会执行但没有任何效果。

数据的添加,删除,查询。

- (void)insertLikesData:(NSString*)string {if ([self.likesDataBase open]) {BOOL result = [self.likesDataBase executeUpdate:@"INSERT INTO likesData (id) VALUES (?);", string];if (!result) {NSLog(@"增加数据失败");} else {NSLog(@"增加数据成功");}[self.likesDataBase close];}
}
- (void)deleteLikesDate:(NSString*)nowID {if ([self.likesDataBase open]) {NSString *sql = @"delete from likesData WHERE id = ?";BOOL result = [self.likesDataBase executeUpdate:sql, nowID];if (!result) {NSLog(@"数据删除失败");} else {NSLog(@"数据删除成功");}[self.likesDataBase close];}
}
NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString* filename = [collectionDoc stringByAppendingPathComponent:@"collection1.sqlite"];self.collectionDataBase = [FMDatabase databaseWithPath:filename];if ([self.collectionDataBase open]) {FMResultSet* collectionResultSet = [self.collectionDataBase executeQuery:@"SELECT * FROM collectionData"];while ([collectionResultSet next]) {NSString* idString = [collectionResultSet stringForColumn:@"id"];if ([nowIdSting isEqualToString:idString]) {self.flage1 = 1;self.keepButton.tag  = 6;[self.keepButton setImage:[UIImage imageNamed:@"shoucangxuanzhong-2"] forState:UIControlStateNormal];}}[self.collectionDataBase close];}

对于在不同的文件下获取到库,在开始没有理解其用处,以为要将库保存下来并传值,那么就没有必要创这个库。以上面的查询为例,获取数据库文件的路径,获取数据库,注意文件的路径必须一样。

NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString* filename = [collectionDoc stringByAppendingPathComponent:@"collection1.sqlite"];self.collectionDataBase = [FMDatabase databaseWithPath:filename];

对于点赞收藏的滑动刷新

获取该文章的ID,遍历数据库判断是否收藏点赞,同时刷新控件,这里要注意要改变按钮的点击状态(这里是改变按钮的tag值)

- (void)likesAndCollectReload:(NSString*) nowIdSting{self.flage1 = 0;self.flage2 = 0;NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString* filename = [collectionDoc stringByAppendingPathComponent:@"collection1.sqlite"];self.collectionDataBase = [FMDatabase databaseWithPath:filename];if ([self.collectionDataBase open]) {FMResultSet* collectionResultSet = [self.collectionDataBase executeQuery:@"SELECT * FROM collectionData"];while ([collectionResultSet next]) {NSString* idString = [collectionResultSet stringForColumn:@"id"];if ([nowIdSting isEqualToString:idString]) {self.flage1 = 1;self.keepButton.tag  = 6;[self.keepButton setImage:[UIImage imageNamed:@"shoucangxuanzhong-2"] forState:UIControlStateNormal];}}[self.collectionDataBase close];}if (self.flage1 == 0) {self.keepButton.tag  = 3;[self.keepButton setImage:[UIImage imageNamed:@"shoucang-2"] forState:UIControlStateNormal];}NSString *goodDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString * fileName = [goodDoc stringByAppendingPathComponent:@"likes.sqlite"];self.likesDataBase = [FMDatabase databaseWithPath:fileName];if ([self.likesDataBase open]) {// 1.执行查询语句FMResultSet *likesResultSet = [self.likesDataBase executeQuery:@"SELECT * FROM likesData"];// 2.遍历结果while ([likesResultSet next]) {NSString* idString1 = [likesResultSet stringForColumn:@"id"];if ([nowIdSting isEqualToString:idString1]) {self.flage2 = 1;self.likesButton.tag = 4;[self.likesButton setImage:[UIImage imageNamed:@"a-24geshangchuan-20"] forState:UIControlStateNormal];}}[self.likesDataBase close];}if (self.flage2 == 0) {self.likesButton.tag = 2;[self.likesButton setImage:[UIImage imageNamed:@"good"] forState:UIControlStateNormal];}
}

对于文章的收藏于取消收藏,我们一般将数据库的数据提取到数组中使用,在数据库内容发生改变时,就需要重新提取。以在文章内容界面取消收藏,返回收藏夹更新收藏夹的内容为例子。这里用到通知在返回到收藏夹执行相应的更新方法

[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadCollectCell" object:nil userInfo:nil];[self dismissViewControllerAnimated:YES completion:nil];
- (void)reloadCollectCell{[self twoArrayInit];[self.storiesTableView reloadData];
}
- (void)twoArrayInit {self.titleArray = [NSMutableArray array];self.imageUrlArray = [NSMutableArray array];self.idArray = [NSMutableArray array];self.urlArray = [NSMutableArray array];NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString* filename = [collectionDoc stringByAppendingPathComponent:@"collection1.sqlite"];self.collectionDataBase = [FMDatabase databaseWithPath:filename];if ([self.collectionDataBase open]) {FMResultSet* collectionResultSet = [self.collectionDataBase executeQuery:@"SELECT * FROM collectionData"];while ([collectionResultSet next]) {NSString* idString = [collectionResultSet stringForColumn:@"id"];[self.idArray addObject:idString];[self.titleArray addObject:[collectionResultSet stringForColumn:@"mainLabel"]];[self.imageUrlArray addObject:[collectionResultSet stringForColumn:@"imageURL"]];[self.urlArray addObject:[collectionResultSet stringForColumn:@"url"]];}[self.collectionDataBase close];}
}

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

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

相关文章

Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件 效果 使用示例 // 点按connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);// 长按开始connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);//…

Clickhouse学习笔记(11)—— 数据一致性

使用合并树引擎时,无论是ReplacingMergeTree还是SummingMergeTree,都只能保证数据的最终一致性,因为数据的去重、聚合等操作会在数据合并的期间进行,而合并会在后台以一个不确定的时间进行,因此无法预先计划&#xff1…

c语言:用指针解决有关字符串等问题

题目1&#xff1a;将一个字符串str的内容颠倒过来&#xff0c;并输出。 数据范围&#xff1a;1≤len(str)≤10000 代码和思路&#xff1a; #include <stdio.h> #include<string.h> int main() {char str1[10000];gets(str1);//读取字符串内容char* p&str1[…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件&#xff08;电阻、电容、电感&#xff09;组成&#xff0c;则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

从0开始python学习-32.pytest.mark()

目录 1. 用户自定义标记 1.1 注册标记​编辑 1.2 给测试用例打标记​编辑 1.3 运行标记的测试用例 1.4 运行多个标记的测试用例 1.5 运行指定标记以外的所有测试用例 2. 内置标签 2.1 skip &#xff1a;无条件跳过&#xff08;可使用在方法&#xff0c;类&#xff0c;模…

[vuex] unknown mutation type: SET_SOURCE

项目中使用了vuex&#xff0c;并且以模块的形式分好之后。在调用的时候出现了以上问题 /*当我们commit的时候要注意要加上模块的名字 user是模块名称&#xff0c;SET_SOURCE是user模块中定义的方法 正确写法&#xff1a;*/ this.$store.commit("user/SET_SOURCE", th…

火爆进行中的抖音双11好物节,巨量引擎助5大行业商家开启爆单之路!

抖音双11好物节目前正在火热进行中&#xff0c;进入爆发期&#xff0c;各大商家“好招”频出&#xff0c;都想要实现高速增长。依托“人群、货品、流量”三大优势&#xff0c;巨量引擎一直都是商家生意增长的给力伙伴&#xff0c;在今年的抖音双11好物节&#xff0c;巨量引擎就…

Vue3 源码解读系列(二)——初始化应用实例

初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事&#xff1a; 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象&#xff0c;延时创建渲染器&#xff0c;优点是当用户只依赖响应式包的时候&#xff0…

网络的分类和特点

对于计算机网络&#xff0c;按照不同的标准有不同的分类方法。 ▶1.按计算机的物理连接方式分类 计算机连接的物理方式决定了网络的拓扑结构。按网络的拓扑结构可以分为星形拓扑网络、环形拓扑网络、总线型拓扑网络、网状拓扑网络等。 1)星形拓扑 星形拓扑的网络以一台中央…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息&#xff0c;这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题&#xff1a; 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

【毕业论文】基于python爬虫对豆瓣影评分析系统的设计与实现

题目 基于python爬虫对豆瓣影评分析系统的设计与实现 Design and Implementation of a Python-based Web Crawler for Analyzing Douban Movie Reviews 目录 目录 2 摘要 3 关键词 3 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.3 国内外研究现状 6 1.4 研究内容和…

华为ensp:vrrp双机热备负载均衡

现在接口ip都已经配置完了&#xff0c;直接去配置vrrp r1上192.168.1.100 作为主 192.168.2.100作为副 r2上192.168.1.199 作为副 192.168.2.100作为主 这样就实现了负载均衡&#xff0c;如果两个都正常运行时&#xff0c;r1作为1.1的网关&#xff0c;r2作为2.1网关…

Vue3+NodeJS 接入文心一言, 发布一个 VSCode 大模型问答插件

目录 一&#xff1a;首先明确插件开发方式 二&#xff1a;新建一个Vscode 插件项目 1. 官网教程地址 2. 一步一步来创建 3. 分析目录结构以及运行插件 三&#xff1a;新建一个Vue3 项目&#xff0c;在侧边栏中展示&#xff0c;实现vscode插件 <> vue项目 双向消息传…

“第六十六天”

这个我记得是有更优解的&#xff0c;不过还是明天发吧&#xff0c;明天想一想&#xff0c;看看能不能想起来 #include<string.h> int main() {char a[201] { 0 };char b[201] { 0 };scanf("%s %s", a, b);int na strlen(a);int nb strlen(b);int i 0, j …

【408】计算机学科专业基础 - 数据结构

数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据&#xff1a; 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…

css:两个行内块元素和图片垂直居中对齐

目录 两个行内块元素垂直居中对齐图片垂直居中问题图片和文字垂直居中对齐参考文章 两个行内块元素垂直居中对齐 先看一段代码&#xff1a; <style> .box {width: 200px;height: 200px;line-height: 200px;font-size: 20px;text-align: center;display: inline-block;b…

计算机毕业设计选题推荐-校园交流平台微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Qt之qobject_cast使用

描述 qobject_cast是Qt中的一个转换函数&#xff0c;主要用于在QObject子类之间进行转换&#xff0c;实现父类指针向子类指针的转换。其语法为&#xff1a; qobject_cast<T>(object);其中&#xff0c;T表示目标类型&#xff0c;object表示要转换的QObject对象指针。 q…

【tgcalls】Instance接口的实例类的创建

tg 里有多个版本,因此设计了版本管理的map,每次可以选择一个版本进行实例创建这样,每个客户端就可以定制开发了。tg使用了c++20创建是要传递一个描述者,里面是上下文信息 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Instance.cpp可以看到竟然是…

基于Qt 多线程(继承自QThread篇)

# 简介 我们写的一个应用程序,应用程序跑起来后一般情况下只有一个线程,但是可能也有特殊情况。比如我们前面章节写的例程都跑起来后只有一个线程,就是程序的主线程。线程内的操作都是顺序执行的。恩,顺序执行?试着想一下,我们的程序顺序执行,假设我们的用户界面点击有某…