FMDB是一个在iOS和Mac应用程序中使用SQLite数据库的第三方库。它是使用Objective-C编写的,提供了一个简单易用的接口,用于执行SQL查询和操作数据库。
FMDB封装了SQLite C语言接口,简化了数据库操作的复杂性,并提供了一些便捷的方法和功能,使开发者可以更轻松地进行数据库的读取、写入和查询操作。使用FMDB库,你可以执行SQL语句来创建、修改和查询数据库表格,插入、更新和删除数据等。
第一步:建立相应的数据库表格,用来存储想要保留的数据,这里以点赞以及收藏来举例:
//FMDB初始化
- (void)databaseInit {
NSString* collectionDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* collectionFileName = [collectionDoc stringByAppendingPathComponent:@"collectionData.sqlite"];
self.collectionDatabase = [FMDatabase databaseWithPath:collectionFileName];
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);"];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
}
NSString *goodDoc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *goodFileName = [goodDoc stringByAppendingPathComponent:@"goodData.sqlite"];
self.goodDatabase = [FMDatabase databaseWithPath:goodFileName];
if ([self.goodDatabase open]) {
BOOL result = [self.goodDatabase executeUpdate:@"CREATE TABLE IF NOT EXISTS goodData (id text NOT NULL);"];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
}
}
上述代码创建了两个数据库表格用来分别存储点赞以及收藏的相关数据。
第二步:实现数据的插入和删除。
//插入点赞数据
- (void) insertGoodData: (NSString*) string {
if ([self.goodDatabase open]) {
BOOL result = [self.goodDatabase executeUpdate:@"INSERT INTO goodData (id) VALUES (?);", string];
if (!result) {
NSLog(@"增加数据失败");
} else {
NSLog(@"增加数据成功");
}
[self.goodDatabase close];
}
}
//插入收藏数据
- (void)insertCollectionData:(NSString *)mainLabel and:(NSString *)imageURL and:(NSString *)nowId{
if ([self.collectionDatabase open]) {
BOOL result = [self.collectionDatabase executeUpdate:@"INSERT INTO collectionData (mainLabel, imageURL, id) VALUES (?, ?, ?);", mainLabel, imageURL, nowId];
NSLog(@"*** %@ ***", nowId);
NSLog(@"** %@ ", mainLabel);
if (!result) {
NSLog(@"增加数据失败");
} else {
NSLog(@"增加数据成功");
}
[self.collectionDatabase close];
}
}
// 删除点赞数据
- (void)deleteGoodData:(NSString *)nowId {
if ([self.goodDatabase open]) {
NSString *sql = @"delete from goodData WHERE id = ?";
BOOL result = [self.goodDatabase executeUpdate:sql, nowId];
if (!result) {
NSLog(@"数据删除失败");
} else {
NSLog(@"数据删除成功");
}
[self.goodDatabase close];
}
}
// 删除收藏数据
- (void)deleteCollectionData:(NSString *)nowId {
if ([self.collectionDatabase open]) {
NSString *sql = @"delete from collectionData WHERE id = ?";
BOOL result = [self.collectionDatabase executeUpdate:sql, nowId];
if (!result) {
NSLog(@"数据删除失败");
} else {
NSLog(@"数据删除成功");
}
[self.collectionDatabase close];
}
}
第三步:实现数据的查询。
//查询收藏数据
- (void) queryDatacollection {
int collect = 0;
if ([self.collectionDatabase open]) {
// 1.执行查询语句
FMResultSet *collectionResultSet = [self.collectionDatabase executeQuery:@"SELECT * FROM collectionData"];
// 2.遍历结果
while ([collectionResultSet next]) {
NSString *id = [collectionResultSet stringForColumn:@"id"];
int idInt = [id intValue];
int nowInt = [_ides intValue];
NSLog(@"+++ %d +++", idInt);
NSLog(@" ");
NSLog(@"+++ %d +++", nowInt);
if (nowInt == idInt) {
self.flage2 = 1;
self.btnImage4.tag = 104;
[self.btnImage4 setImage:[UIImage imageNamed:@"10.png"] forState:UIControlStateNormal];
NSLog(@"12345566");
collect = 1;
}
}
[self.collectionDatabase close];
}
if (collect == 0) {
self.btnImage4.tag = 4;
[self.btnImage4 setImage:[UIImage imageNamed:@"9.png"] forState:UIControlStateNormal];
}
}
//查询点赞数据
- (void) queryDatagood {
int good = 0;
if ([self.goodDatabase open]) {
// 1.执行查询语句
FMResultSet *goodResultSet = [self.goodDatabase executeQuery:@"SELECT * FROM goodData"];
// 2.遍历结果
while ([goodResultSet next]) {
NSString *nowId = [NSString stringWithFormat:@"%@", [goodResultSet objectForColumn:@"id"]];
int idInt = [nowId intValue];
int nowInt = [_ids intValue];
NSLog(@"+++ %d +++", idInt);
NSLog(@" ");
NSLog(@"+++ %d +++", nowInt);
if (idInt == nowInt) {
self.btnImage3.tag = 103;
[self.btnImage3 setImage:[UIImage imageNamed:@"8.png"] forState:UIControlStateNormal];
int goodNum = [self.badgeLabel2.text intValue];
NSLog(@"+++ %d +++",goodNum);
goodNum++;
self.badgeLabel2.text = [NSString stringWithFormat:@"%d", goodNum];
//break;
self.flage1 = 1;
good = 1;
}
}
[self.goodDatabase close];
}
if (good == 0) {
self.btnImage3.tag = 3;
[self.btnImage3 setImage:[UIImage imageNamed:@"7.png"] forState:UIControlStateNormal];
int goodNum = [self.badgeLabel2.text intValue];
self.badgeLabel2.text = [NSString stringWithFormat:@"%d", goodNum];
}
}
通过这三步就可以实现对于点赞以及收藏的本地持久化。
实现的思想:通过点赞和收藏按钮来实现点赞和收藏的数据的添加以及删除,然后每次加载界面的时候都会遍历一遍数据库从而判断出那个新闻已经被点赞被收藏,然后改变他们点赞和收藏按钮的状态。
收藏夹的界面是一个tableview,通过点击对应的单元格,就可以进入到对应的已经收藏的新闻界面中。
则可以看到该界面的新闻的收藏按钮是被选中的状态,我们也可以再次点击收藏按钮,使它变为不被选中的状态,然后更新tableview,从而达到取消收藏的目的。
在收藏夹的界面中,通过下面这两个方法来更新tableview,实现从收藏夹中取消收藏的目的。
- (void)getDeleteRow:(NSInteger)row {
[self deleteCollectionData:self.collectArray[row][@"id"]];
[self.collectArray removeObjectAtIndex:row];
self.collectArray = self.collectArray;
[self.tableview reloadData];
}
- (void)viewDidAppear:(BOOL)animated {
[self queryData];
[self.tableview reloadData];
}