iOS开发-SQLite数据库在App项目中的设置及使用
2017-01-31 10:12
721 查看
在iOS开发中,除了UI页面以外使用最多的估计是数据对象的存储了~比如聊天记录、通讯录和通讯记录、浏览记录等等。我们要根据不同的使用方式去对这些数据存储并使用。常用的有:①沙盒机制
②属性列表plist ③SQLite ④CoreData,本文介绍的就是基础的SQLite的存储机制,其他的稍后会陆续跟进~
一、首先要注意SQLite的特性:无数据类型的数据库,所以和在别的平台上的SQL会有一定的差距
二、常用数据类型
· integer有符号的整数类型
· text字符串类型
· real浮点类型
· blob二进制对象类型
三、在项目中创建数据库
①在项目中引入sql支持库:libsqlite3.tbd,还有一个3.0的,我个人用3,不要问我为什么啊(╯‵□′)╯︵┻━┻
②配置数据库,创建两个NSObject类,一个作为model 一个作为数据库操作
假设我们只存储两个数据,一个是又textview写入的文本,一个是当前时间
到目前为止数据库的处理就是基本完成了,剩下的就是去项目里面开始实际操作,为了方便写了一个DBManager用来管理引用数据库操作和model值得传递
在首页先记得声明消息中心
然后删除的方法我写在了tableview的编辑里面直接完成删除操作~
四、也许有人会问我为什么增删改查没有“改”这一项,我想说我也不知道啊,如果知道的教教我~哈哈,正常来说都是网络请求的数据保存到本地做查询和删除,修改数据都是直接上传到服务器上面。表示没有做过需要在本地修改的数据库项目~(╯‵□′)╯︵┻━┻(我是菜鸡)
附上传送门:demo
②属性列表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; @end DataModel.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; @end DBOperation.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; @end DBManager.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
相关文章推荐
- 献给初学iOS的小盆友们——微博app项目开发之三设置导航条
- 献给初学iOS的小盆友们——微博app项目开发之九未读数设置以及后台播放
- 献给初学iOS的小盆友们——微博app项目开发之四设置导航功能
- IntelliJ IDEA 开发web项目的一些设置及使用方法
- iOS开发之iOS程序偏好设置(Settings Bundle)的使用
- iOS开发(iPad/iPhone)设置app界面 默认横向显示的两种方法
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- 转:IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- 使用github管理iOS分布式项目开发
- ios开发答疑录系列---(四)OS开发中混合使用ARC和非ARC项目
- iOS开发中混合使用ARC和非ARC项目
- 使用github管理iOS分布式项目开发
- 【ios开发】使用FMDB封装类的sqlite数据库操作
- iOS开发20:使用Settings Bundle为程序添加设置项
- IOS开发8---APP应用程序图标 及 程序启动画面设置。
- iphone/iOS开发 - SQLite数据库使用
- IOS开发之iOS程序偏好设置(Settings Bundle)的使用
- 在ios开发中Sqlite数据库的使用
- 在ios开发中Sqlite数据库的使用
- 【ios开发】项目中AppDelegate详解