用数据库实现收藏功能.

这里将数据库的封装为一个工具类.将数据库设计为一个单例,封装一些打开,创建表格,增,删,改,查的方法.在收藏功能中主要用到,查询,增添,和删除的方法.

查询,返回的数据,是你存入的数据内容.可以返回数据库的全部内容,也可以根据某个属性,返回符合该属性的内容.

代码区别:

根据title来查询数据库中内容,返回与title一样的数据.



主要思路:

1.查询数据库的内容,遍历返回的数组来判断数据库中是否有想要收藏的数据(model),以此来判断收藏提示界面的状态.

2.收藏界面状态的更换,来判断什么时候往数据库中插入某条数据,什么时候删除数据库中的某条数据.



3.查询数据库中的内容,,将数据库中的内容在另外一个界面将数据库中的model展现出来.

将要收藏的数据(model)插入导数据库当中



实现该功能中遇到的问题: 

1.什么时候插入数据,什么时候删除数据,不能写在   遍历查询返回的数组当中  ,会导致多条数据同时插入,同时删除.

2.判断起初的收藏状态,必须在该界面初始化之后,界面出现之前,多注意程序走方法的先后顺序.

3.数据库建立的 表格,若是同名,后建的表格不会替换之前的表格,若是表格添加了新的一列,属性,必须在文件夹中,将原始建立的表格删除.

4.数据库存数据的小技巧,先考虑自己想要存的内容,根据想要存的内容建立model类型,

在收藏界面,用该model的属性接收来自不同界面来的model类型的属性(一般为字符串属性,分开接收,这样避免直接接收整个model时需要判断不同的model类型)

避免界面一样,model的属性不同 ,导致数据中存储一些(null)的数据.


#import .h

@class ModelForListen;

@interface DataBaseHandler : NSObject

+ (instancetype)shareDataBaseHandler;

- (void)open;

- (void)createTable;

- (void)insertModel:(ModelForListen *) model;

- (void)updataModel:(ModelForListen *)model ForNumber:(NSInteger)number;

- (void)deleteWithTitle:(NSString *)title;

- (void)deleteWithModel:(ModelForListen *)model;

- (NSArray *)selectForTitle:(NSString *)title;

- (NSArray *)selectForModel;

- (void)dropTable;

- (void)closeDB;

.m

////  DataBaseHandler.m//  UI21_SQLite////  Created by dllo on 16/1/11.//  Copyright © 2016年 dllo. All rights reserved.//#import "DataBaseHandler.h"#import#import "ModelForListen.h"

@implementation DataBaseHandler

#pragma mark - 知识点 1 单例

+ (instancetype)shareDataBaseHandler {

//在静态区,只初始化一次 创建数据库对象

static DataBaseHandler *dataBase = nil;

if (dataBase == nil) {

dataBase = [[DataBaseHandler alloc] init];

}

return dataBase;

}

/** 定义一个 sqlite 结构体 (对象) */

sqlite3 *db;

#pragma mark - 知识点 2 :打开数据库

- (void)open{

// API: sqlite3_open

if (db != nil) {

NSLog(@"数据库已经开启");

return;

}

NSString *file = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"model.sqlite"];

NSLog(@"%@",file);

/**

* @praram filename 数据库文件的路径(注意!类型为 c 字符串)

*

* @param ppDb 数据库对象

*

**/

int result = sqlite3_open(file.UTF8String, &db);

if (result == SQLITE_OK) {

NSLog(@"数据库打开成功");

}else{

NSLog(@"数据打开失败, code = %d", result);

}

}

#pragma mark - 知识点 3 创建表格

- (void)createTable{

// API: sqlite3_exec

// 创建 SQL 语句.

//////////////

NSString *createTableSQL = @"CREATE TABLE IF NOT EXISTS lanou1130(number INTEGER PRIMARY KEY AUTOINCREMENT, title text, lastUptrackTitle text, coverSmall text, albumId text, nickname text, coverLarge text, trackTitle text)";

int result = sqlite3_exec(db, createTableSQL.UTF8String, NULL, NULL, nil);

if (result == SQLITE_OK) {

NSLog(@"创建表格成功");

}else{

NSLog(@"创建表格失败. code :%d", result);

}

}

#pragma mark - 知识点 4 插入数据

- (void)insertModel:(ModelForListen *)model {

// API :sqlite3_exec

/////////////

NSString *insertSQL = [NSString stringWithFormat:@"INSERT into lanou1130(title, lastUptrackTitle, coverSmall, albumId, nickname, coverLarge, trackTitle) VALUES('%@', '%@', '%@', '%@', '%@', '%@', '%@')", model.title, model.lastUptrackTitle, model.coverSmall,model.albumId,model.nickname,model.coverLarge,model.trackTitle];

int result = sqlite3_exec(db, insertSQL.UTF8String, nil, nil, nil);

if (result == SQLITE_OK) {

NSLog(@"添加数据完成");

}else{

NSLog(@"添加数据失败.code:%d", result);

}

}

#pragma mark - 知识点 5 更新数据

- (void)updataModel:(ModelForListen *)model ForNumber:(NSInteger)number{

//API :sqlite2_exec

NSString *updataSQL = [NSString stringWithFormat:@"UPDATE lanou1130 SET title = '%@', lastUptrackTitle = '%@', coverSmall = '%@' albumId = '%@'  nickname = '%@' coverLarge = '%@' trackTitle = '%@' WHERE number = '%ld'",model.title, model.lastUptrackTitle, model.coverSmall, model.albumId,model.nickname,model.coverLarge,model.trackTitle, number];

int result = sqlite3_exec(db, updataSQL.UTF8String, nil, nil, nil);

if (result == SQLITE_OK) {

NSLog(@"更新成功");

}else {

NSLog(@"更新失败, code:%d", result);

}

}

#pragma mark -- 知识点 6 :删除数据

- (void)deleteWithTitle:(NSString *)title {

//API sqlite3_exec

NSString *deleteSQL = [NSString stringWithFormat:@"DELETE FROM lanou1130 WHERE title = '%@'",title];

int result = sqlite3_exec(db, deleteSQL.UTF8String, nil, nil, nil);

if (result == SQLITE_OK) {

NSLog(@"删除成功");

}else{

NSLog(@"删除失败 code:%d", result);

}

}

- (void)deleteWithModel:(ModelForListen *)model {

NSString *deleteSQL = [NSString stringWithFormat:@"DELETE FROM lanou1130 WHERE title = '%@'",model.title];

int result = sqlite3_exec(db, deleteSQL.UTF8String, nil, nil, nil);

if (result == SQLITE_OK) {

NSLog(@"删除成功");

}else{

NSLog(@"删除失败 code:%d", result);

}

}

#pragma mark --知识点 7  查询数据

- (NSArray *)selectForTitle:(NSString *)title{

/** 存放符合条件的查询数据 (元素是 model 对象)*/

NSMutableArray *arr = [NSMutableArray array];

// sql 语句

NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM lanou1130 WHERE title = '%@'", title];

//API : stmt 结构体, sqlite3_prepareV2,sqlite3_step, sqlite_column

// 声明一个结构体 stmt 对象 (结构体)

sqlite3_stmt *stmt = nil;

//(准备好的语句对象)

int result = sqlite3_prepare_v2(db, selectSQL.UTF8String, -1, &stmt, nil);

if (result == SQLITE_OK) {

// 逐行查询 每行都执行查询语句

while (sqlite3_step(stmt) == SQLITE_ROW) {

// 如果查询条件匹配, 通过 sqlite3_column 函数蔟 取出值;

const unsigned char *title = sqlite3_column_text(stmt, 1);// 取出哪一列的数据值

const unsigned char *lastUptrackTitle = sqlite3_column_text(stmt, 2);

const unsigned char *coverSmall = sqlite3_column_text(stmt, 3);

const unsigned char *albumId = sqlite3_column_text(stmt, 4);

const unsigned char *nickname = sqlite3_column_text(stmt, 5);

const unsigned char *coverLarge = sqlite3_column_text(stmt, 6);

const unsigned char *trackTitle = sqlite3_column_text(stmt, 7);

//          int age = sqlite3_column_int(stmt, 3);

// 创建 model 对象, 赋值之后放入数组中

ModelForListen *model = [[ModelForListen alloc] init];

model.title = [NSString stringWithUTF8String:(const char *) title];

model.lastUptrackTitle = [NSString stringWithUTF8String:(const char*) lastUptrackTitle];

model.coverSmall = [NSString stringWithUTF8String:(const char*) coverSmall];

model.albumId = [NSString stringWithUTF8String:(const char*)albumId];

model.nickname = [NSString stringWithUTF8String:(const char*)nickname];

model.coverLarge = [NSString stringWithUTF8String:(const char*)coverLarge];

model.trackTitle = [NSString stringWithUTF8String:(const char*)trackTitle];

[arr addObject:model];

}

NSLog(@"准备就绪,查询中...");

// 销毁对象

sqlite3_finalize(stmt);

}else {

NSLog(@"不能正常查询, code:%d", result);

// 销毁对象

sqlite3_finalize(stmt);

}

return arr;

}

- (NSArray *)selectForModel {

/** 存放符合条件的查询数据 (元素是 model 对象)*/

NSMutableArray *arr = [NSMutableArray array];

// sql 语句

NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM lanou1130"];

//API : stmt 结构体, sqlite3_prepareV2,sqlite3_step, sqlite_column

// 声明一个结构体 stmt 对象 (结构体)

sqlite3_stmt *stmt = nil;

//(准备好的语句对象) -1 代表查询全部对象.

int result = sqlite3_prepare_v2(db, selectSQL.UTF8String, -1, &stmt, nil);

if (result == SQLITE_OK) {

// 逐行查询 每行都执行查询语句

while (sqlite3_step(stmt) == SQLITE_ROW) {

// 如果查询条件匹配, 通过 sqlite3_column 函数蔟 取出值;

const unsigned char *title = sqlite3_column_text(stmt, 1);// 取出哪一列的数据值

const unsigned char *lastUptrackTitle = sqlite3_column_text(stmt, 2);

const unsigned char *coverSmall = sqlite3_column_text(stmt, 3);

const unsigned char *albumId = sqlite3_column_text(stmt, 4);

const unsigned char *nickname = sqlite3_column_text(stmt, 5);

const unsigned char *coverLarge = sqlite3_column_text(stmt, 6);

const unsigned char *trackTitle = sqlite3_column_text(stmt, 7);

//          int age = sqlite3_column_int(stmt, 3);

// 创建 model 对象, 赋值之后放入数组中

ModelForListen *model = [[ModelForListen alloc] init];

model.title = [NSString stringWithUTF8String:(const char *) title];

model.lastUptrackTitle = [NSString stringWithUTF8String:(const char*) lastUptrackTitle];

model.coverSmall = [NSString stringWithUTF8String:(const char*) coverSmall];

model.albumId = [NSString stringWithUTF8String:(const char*)albumId];

model.nickname = [NSString stringWithUTF8String:(const char*)nickname];

model.coverLarge = [NSString stringWithUTF8String:(const char*)coverLarge];

model.trackTitle = [NSString stringWithUTF8String:(const char*)trackTitle];

[arr addObject:model];

}

NSLog(@"准备就绪,查询中...");

// 销毁对象

sqlite3_finalize(stmt);

}else {

NSLog(@"不能正常查询, code:%d", result);

// 销毁对象

sqlite3_finalize(stmt);

}

return arr;

}

#pragma mark --知识点 8 删除表单

-(void)dropTable{

NSString *dropSQL = @"DROP TABLE lanou1130";

int result = sqlite3_exec(db, dropSQL.UTF8String, nil, nil, nil);

if (result == SQLITE_OK) {

NSLog(@"删除表格成功!!!!");

}else{

NSLog(@"删除失败");

}

}

#pragma mark --关掉数据库

- (void)closeDB {

// API:sqlite3_close

int result = sqlite3_close(db);

if (result == SQLITE_OK) {

NSLog(@"数据库关闭成功");

db = nil;

}else{

NSLog(@"数据库关闭失败. code :%d", result);

}

}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容