在iOS开发中,除了UI页面以外使用最多的估计是数据对象的存储了~比如聊天记录、通讯录和通讯记录、浏览记录等等。我们要根据不同的使用方式去对这些数据存储并使用。常用的有:①沙盒机制 ②属性列表plist ③SQLite ④CoreData,本文介绍的就是基础的SQLite的存储机制,其他的稍后会陆续跟进~
一、首先要注意SQLite的特性:无数据类型的数据库,所以和在别的平台上的SQL会有一定的差距
二、常用数据类型
· integer有符号的整数类型
· text字符串类型
· real浮点类型
· blob二进制对象类型
三、在项目中创建数据库
①在项目中引入sql支持库:libsqlite3.tbd,还有一个3.0的,我个人用3,不要问我为什么啊(╯‵□′)╯︵┻━┻
②配置数据库,创建两个NSObject类,一个作为model 一个作为数据库操作
假设我们只存储两个数据,一个是又textview写入的文本,一个是当前时间
DataModel.h文件
#import
@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
// 引入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
#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];
}
}
[objc] view plain copy
附上传送门:demo
---------------------
作者:伪随机的张三
来源:CSDN
原文:https://blog.csdn.net/werctzzz/article/details/54783012
版权声明:本文为博主原创文章,转载请附上博文链接!