因为上周的金工实习,所以知乎日报的仿写往后面拖了一周,但深的东西也比较少了 ;所以这次的内容不会很多 ;
具体完成了收藏和点赞的本地持久化和滑动更新;
两者原理差不多 ;
- (void)presszan : (UIButton*) zanbtn{
if (zanbtn.selected == NO) {
zanbtn.selected = YES ;
if ([self.mModel.zan_Database open]) {
FMResultSet* resultSet = [self.mModel.zan_Database executeQuery:@"SELECT * FROM zanData"] ;
int juide = 0 ;
while ([resultSet next]) {
NSString* string = [resultSet stringForColumn:@"id"] ;
NSString* str = [self.newarray[self.index][@"id"] stringValue] ;
if ([string isEqual:str]) {
juide = 1 ;
}
}
if (juide == 0) {
// NSString* string = self.newarray[self.index][@"id"] ;
// NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
// NSNumber *number = [numberFormatter numberFromString:string];
NSNumber* number = self.newarray[self.index][@"id"] ;
BOOL result = [self.mModel.zan_Database executeUpdate:@"INSERT INTO zanData (id) VALUES (?)",number] ;
if (result) {
NSLog(@"插入成功") ;
} else {
NSLog(@"插入失败") ;
}
} else {
NSLog(@"已存在") ;
}
}
} else {
zanbtn.selected = NO ;
if ([self.mModel.zan_Database open]) {
// NSString* string = self.newarray[self.index][@"id"] ;
// NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
// NSNumber *number = [numberFormatter numberFromString:string];
NSNumber* number = self.newarray[self.index][@"id"] ;
BOOL result = [self.mModel.zan_Database executeUpdate:@"delete from zanData WHERE id = ?",number] ;
if (result) {
NSLog(@"删除成功") ;
} else {
NSLog(@"删除失败") ;
}
}
}
//更新点赞数
int cnt = [self.mModel.extrdict[@"popularity"] intValue] + self.mView.zanbtn.selected ;
NSNumber* number = [NSNumber numberWithInt:cnt] ;
self.mView.label02.text = [NSString stringWithFormat:@"%@",[number stringValue]] ;
// FMResultSet* resultSet01 = [self.mModel.zan_Database executeQuery:@"SELECT * FROM zanData"] ;
//
// while ([resultSet01 next]) {
// NSString* string = [resultSet01 stringForColumn:@"id"] ;
// }
[self.mModel.zan_Database close] ;
}
上面是我的点赞按钮函数,逻辑当爱就是,每次点击就对点赞按钮进行判断,当点赞时,遍历数据库中的数据,查看是否有当前新闻的id,没有则添加;取消点赞一样的 ;且每次都要及时更新点赞数的text ;
这里只是简单的使用了几个方法,具体可以看看本地持久化 ,这里对这里用的方法讲的要清楚一些 ;
数据库的创建:
NSString* doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] ;
NSString* file_name02 = [doc stringByAppendingPathComponent:@"shoucangData.sqlite"] ;
self.shoucang_Database = [FMDatabase databaseWithPath:file_name02] ;
表的创建:
if ([self.shoucang_Database open]) {
BOOL result = [self.shoucang_Database executeUpdate:@"CREATE TABLE IF NOT EXISTS shoucangData (id NOT NULL);"] ;
if (result) {
NSLog(@"创建表成功") ;
} else {
NSLog(@"创建表失败") ;
}
[self.shoucang_Database close] ;
}
插入:
if ([self.mModel.shoucang_Database open]) {
FMResultSet* resultSet = [self.mModel.shoucang_Database executeQuery:@"SELECT * FROM shoucangData"] ;
int juide = 0 ;
while ([resultSet next]) {
NSString* string = [resultSet stringForColumn:@"id"] ;
NSString* str = self.newarray[self.index][@"id"] ;
if ([string isEqual:str]) {
juide = 1 ;
}
}
if (juide == 0) {
NSString* string = self.newarray[self.index][@"id"] ;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *number = [numberFormatter numberFromString:string];
BOOL result = [self.mModel.shoucang_Database executeUpdate:@"INSERT INTO shoucangData (id) VALUES (?)",number] ;
if (result) {
NSLog(@"插入成功") ;
} else {
NSLog(@"插入失败") ;
}
} else {
NSLog(@"已存在") ;
}
}
删除:
if ([self.mModel.shoucang_Database open]) {
NSString* string =self.newarray[self.index][@"id"] ;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *number = [numberFormatter numberFromString:string];
BOOL result = [self.mModel.shoucang_Database executeUpdate:@"delete from shoucangData WHERE id = ?",number] ;
if (result) {
NSLog(@"删除成功") ;
} else {
NSLog(@"删除失败") ;
}
}
遍历:
FMResultSet* resultSet01 = [self.mModel.shoucang_Database executeQuery:@"SELECT * FROM shoucangData"] ;
while ([resultSet01 next]) {
NSString* string = [resultSet01 stringForColumn:@"id"] ;
NSLog(@"%@",string) ;
}
[self.mModel.shoucang_Database close] ;
1.网络请求下来的数据类型不确定,最好打印它的类名看看。比如请求的今天和过往新闻的id时NSnumber类型的数字,而直接通过id网络请求到该新闻的信息中,id为NSString,当你拿着两个id对比时isequal方法一定会返回0 ;
2.收藏界面部分实现返回刷新,要对原来的数据数组初始化或者清空 ;这个过程感觉对内存的耗费很严重,之后打算再优化一下 ;
3,然后就是网络请求的异步队列没能实现 ;
还有很大的改进空间,接下来一周会一点点的优化这个项目的,这里就基本完成了。
这应该时目前来说写过的一个最大的项目了,涉及到的知识也很全面,不仅仅是最前面知识的熟练应用,也是一次很好的锻炼 ;