iOS开发-SQLite数据库在App项目中的设置及使用

来源:互联网 发布:linux程序设计pdf下载 编辑:程序博客网 时间:2024/05/01 18:45

在iOS开发中,除了UI页面以外使用最多的估计是数据对象的存储了~比如聊天记录、通讯录和通讯记录、浏览记录等等。我们要根据不同的使用方式去对这些数据存储并使用。常用的有:①沙盒机制 ②属性列表plist ③SQLite ④CoreData,本文介绍的就是基础的SQLite的存储机制,其他的稍后会陆续跟进~


一、首先要注意SQLite的特性:无数据类型的数据库,所以和在别的平台上的SQL会有一定的差距

二、常用数据类型

· integer有符号的整数类型

· text字符串类型

· real浮点类型

· blob二进制对象类型

三、在项目中创建数据库

①在项目中引入sql支持库:libsqlite3.tbd,还有一个3.0的,我个人用3,不要问我为什么啊(╯‵□′)╯︵┻━┻

②配置数据库,创建两个NSObject类,一个作为model 一个作为数据库操作


假设我们只存储两个数据,一个是又textview写入的文本,一个是当前时间

DataModel.h文件#import <Foundation/Foundation.h>@interface DataModel : NSObject// 用来接收文本的属性@property (nonatomic , copy)NSString * text;// 文本保存时间@property (nonatomic , strong)NSDate * date;// 文本初始化-(id)initWithText:(NSString *)text Date:(NSDate*)date;@endDataModel.m文件#import "DataModel.h"@implementation DataModel-(id)initWithText:(NSString *)text Date:(NSDate*)date{    self = [super init];    if (self) {        self.text = text;        self.date = date;    }    return self;}@end
针对数据库的操作就是通过DBOperation来完成,包括表的创建和数据库连接以及各项操作
DBOperation.h文件#import <Foundation/Foundation.h>// 引入model#import "DataModel.h"// 引入sql的支持库#import "sqlite3.h"// 数据库文件名#define DB_Name @"Database.sqlite3"@interface DBOperation : NSObject{    // 数据库对象的成员变量    sqlite3 * database;}// 创建一个管理器+ (DBOperation *)DataBaseManager;// 数据库文件路径- (NSString *)Documentsfilepath;// 打开数据库、创建数据库表- (void)createDataBaseTable;// 添加-(int)addData:(DataModel*)model;// 删除-(int)deleteData:(DataModel*)model;// 修改-(int)editData:(DataModel*)model;// 查询-(NSMutableArray*)selectall;@endDBOperation.m文件#import "DBOperation.h"@implementation DBOperation// 创建一个静态变量static DBOperation * DataBaseManager = nil;+ (DBOperation*)DataBaseManager{    static dispatch_once_t once;    dispatch_once(&once, ^{                DataBaseManager = [[self alloc] init];        [DataBaseManager createDataBaseTable];            });    return DataBaseManager;}// 创建一个数据库,创建名为Text的表设定一个content的属性- (void)createDataBaseTable {    NSString *writableDBPath = [self Documentsfilepath];    const char* charpath = [writableDBPath UTF8String];        if (sqlite3_open(charpath, &database) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(NO,@"数据库打开失败");    } else {        char *err;        // 创建一个数据库表,名为 Text  并添加两个元素 其中textdate为主键        NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Text (textdate TEXT PRIMARY KEY, content TEXT);"];        const char* charSql = [sql UTF8String];                if (sqlite3_exec(database, charSql,NULL,NULL,&err) != SQLITE_OK) {            sqlite3_close(database);            NSAssert(NO, @"建表失败");        }        sqlite3_close(database);    }}// 数据库存放路径- (NSString *)Documentsfilepath {    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    NSString *path = [documentDirectory stringByAppendingPathComponent:DB_Name];        return path;}//添加方法-(int)addData:(DataModel *)model{        NSString *path = [self Documentsfilepath];    const char* charpath = [path UTF8String];        if (sqlite3_open(charpath, &database) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(NO,@"数据库打开失败。");    } else {                NSString *sql = @"INSERT OR REPLACE INTO Text (textdate, content) VALUES (?,?)";        const char* charSql = [sql UTF8String];                sqlite3_stmt *statement;        //预处理过程        if (sqlite3_prepare_v2(database, charSql, -1, &statement, NULL) == SQLITE_OK) {                        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];            NSString *strDate = [dateFormatter stringFromDate:model.date];            const char* charDate  = [strDate UTF8String];                        const char* charContent = [model.text UTF8String];                        //绑定参数开始            sqlite3_bind_text(statement, 1, charDate, -1, NULL);            sqlite3_bind_text(statement, 2, charContent, -1, NULL);                        //执行插入            if (sqlite3_step(statement) != SQLITE_DONE) {                NSAssert(NO, @"插入数据失败。");            }        }        sqlite3_finalize(statement);        sqlite3_close(database);    }    return 0;}//删除方法-(int)deleteData:(DataModel *)model{    NSString *path = [self Documentsfilepath];    const char* charpath = [path UTF8String];        if (sqlite3_open(charpath, &database) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(NO,@"数据库打开失败。");    } else {        NSString *sql = @"DELETE from Text where textdate =?";        const char* charSql = [sql UTF8String];                sqlite3_stmt *statement;        //预处理过程        if (sqlite3_prepare_v2(database, charSql, -1, &statement, NULL) == SQLITE_OK) {            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];            NSString *strDate = [dateFormatter stringFromDate:model.date];            const char * charDate  = [strDate UTF8String];                        //绑定参数开始            sqlite3_bind_text(statement, 1, charDate, -1, NULL);            //执行            if (sqlite3_step(statement) != SQLITE_DONE) {                NSAssert(NO, @"删除数据失败。");            }        }                sqlite3_finalize(statement);        sqlite3_close(database);    }        return 0;}//查询数据方法-(NSMutableArray*)selectall{    NSMutableArray *listData = [[NSMutableArray alloc] init];        NSString *path = [self Documentsfilepath];    const char* charpath = [path UTF8String];        if (sqlite3_open(charpath, &database) != SQLITE_OK) {        sqlite3_close(database);        NSAssert(NO,@"数据库打开失败。");    } else {                NSString *sql =@"SELECT textdate,content FROM Text";        const char* charSql = [sql UTF8String];                sqlite3_stmt *statement;        //预处理过程        if (sqlite3_prepare_v2(database, charSql, -1, &statement, NULL) == SQLITE_OK) {                        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];                        //执行            while (sqlite3_step(statement) == SQLITE_ROW) {                char *bufDate = (char *) sqlite3_column_text(statement, 0);                NSString *strDate = [[NSString alloc] initWithUTF8String: bufDate];                NSDate *date = [dateFormatter dateFromString:strDate];                                char *bufContent = (char *) sqlite3_column_text(statement, 1);                NSString * strContent = [[NSString alloc] initWithUTF8String: bufContent];                                DataModel * model = [[DataModel alloc] initWithText:strContent Date:date];                                [listData addObject:model];            }        }                sqlite3_finalize(statement);        sqlite3_close(database);            }    return listData;}@end

到目前为止数据库的处理就是基本完成了,剩下的就是去项目里面开始实际操作,为了方便写了一个DBManager用来管理引用数据库操作和model值得传递

DBManager.h文件#import <Foundation/Foundation.h>#import "DataModel.h"#import "DBOperation.h"@interface DBManager : NSObject// 添加-(NSMutableArray *)addTextdata:(DataModel*)model;// 删除-(NSMutableArray *)deleteTextdata:(DataModel*)model;// 查询-(NSMutableArray *)selectall;@endDBManager.m文件#import "DBManager.h"@implementation DBManager// 这个类是用来作为媒介,可用可不用,只是为了让过程更加清晰// 添加-(NSMutableArray *)addTextdata:(DataModel *)model{    DBOperation * m = [DBOperation DataBaseManager];    [m addData:model];    return [m selectall];}// 删除-(NSMutableArray *)deleteTextdata:(DataModel *)model{    DBOperation * m = [DBOperation DataBaseManager];    [m deleteData:model];    return [m selectall];}// 查询-(NSMutableArray *)selectall{    DBOperation * m = [DBOperation DataBaseManager];    return [m selectall];}@end
③我们回到页面创建的地方,开始创建视图,代码就不详细讲解了,在附上的demo中有很详细的注释,目前就是讲一个引导性的思路~在首页创建一个tableview,用来展示数据,通过nav上的button进入到add页面,直接调用DBManager的add方法,我在这里添加了一个消息中心,方便返回页面时候的传值。

- (void)viewDidLoad {    [super viewDidLoad];        self.view.backgroundColor = [UIColor whiteColor];        UIButton * addbtn = [[UIButton alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2, 100, 120, 30)];    addbtn.backgroundColor = [UIColor redColor];    [addbtn setTitle:@"添加" forState:UIControlStateNormal];    [addbtn addTarget:self action:@selector(add) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:addbtn];        textview = [[UITextView alloc]initWithFrame:CGRectMake(0, 150, self.view.frame.size.width, 100)];    textview.backgroundColor = [UIColor blueColor];    [self.view addSubview:textview];    // Do any additional setup after loading the view.}-(void)add{        DBManager *manager = [[DBManager alloc] init];    DataModel *model = [[DataModel alloc] init];    model.date = [[NSDate alloc] init];    model.text = textview.text;    NSMutableArray *reslist = [manager addTextdata: model];        [[NSNotificationCenter defaultCenter] postNotificationName:@"backaction" object:reslist userInfo:nil];    [self dismissViewControllerAnimated:NO completion:nil];}

在首页先记得声明消息中心

[[NSNotificationCenter defaultCenter] addObserver:self                                             selector:@selector(reloadView:)                                                 name:@"backaction"                                               object:nil];

然后删除的方法我写在了tableview的编辑里面直接完成删除操作~

// 向左滑动可删除数据- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {    if (editingStyle == UITableViewCellEditingStyleDelete) {                DataModel * model = [self.listData objectAtIndex:[indexPath row]];        DBManager * dm = [[DBManager alloc] init];        self.listData = [dm deleteTextdata: model];        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];            }}

四、也许有人会问我为什么增删改查没有“改”这一项,我想说我也不知道啊,如果知道的教教我~哈哈,正常来说都是网络请求的数据保存到本地做查询和删除,修改数据都是直接上传到服务器上面。表示没有做过需要在本地修改的数据库项目~(╯‵□′)╯︵┻━┻(我是菜鸡)

附上传送门:demo

0 0
原创粉丝点击