一 概述
Couchbase是一个跨平台、轻量级、非关系型数据库,适用于Android和IOS移动平台
- Couchbase官方项目地址及项目导入
- Couchbase核心类介绍
- Couchbase数据库示例
二 Couchbase官方项目地址及项目导入
2.1 Github项目地址
Github-Couchbase-lite-ios:https://github.com/couchbase/couchbase-lite-ios
2.2 Couchbase官方地址(OC语言)
Couchbase Lite(Object-C):https://docs.couchbase.com/couchbase-lite/2.7/objc.html
2.3 Couchbase-lite导入项目
打开项目所在路径终端,执行如下指令,生成Profile文件
打开生成的Profile文件,添加Couchbase支持
1 2 3 4 5 6 7 8 9 10 11
| # Uncomment the next line to define a global platform for your project # platform :ios, '9.0'
target 'CouchBase-OC' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! pod 'CouchbaseLite'
# Pods for CouchBase-OC
end
|
添加完成后,执行如下指令,安装Couchbase依赖
关闭原项目,打开CouchBase-OC.xcworkspace
,以xcworkspace
为后缀的项目
三 Couchbase核心类介绍
3.1 Couchbase说明
- Couchbase是一个跨平台的数据库,提供了:Node、PHP、Python、Ruby、Scala、C++、.NET、C、Go等诸多平台等数据库支持
- Couchbase中一条记录是一个Document(文档结构),保存数据等格式是:[document setXXX:value forKey:@"key"];
- Couchbase支持数据库加密,可以通过CBLDatabaseConfiguration进行配置
3.2 导入头文件
1
| #import <CouchbaseLite/CouchbaseLite.h>
|
3.3 CBLDatabaseConfiguration(数据库配置-加密等)
1 2 3 4 5 6 7 8
| CBLDatabaseConfiguration *config = [[CBLDatabaseConfiguration alloc] init]; config.encryptionKey = [[CBLEncryptionKey alloc] initWithPassword:@"secretpassword"];
NSError *error; self.database = [[CBLDatabase alloc] initWithName:@"my-database" config:config error:&error]; if (!self.database) { NSLog(@"Cannot open the database:%@", error); }
|
3.4 创建数据库(如mydb)
1 2
| NSError *error; CBLDatabase *database = [[CBLDatabase alloc] initWithName:@"mydb" error:&error];
|
3.5 创建一条数据记录(Document)
1 2 3 4 5 6 7
| // 创建一个Document CBLMutableDocument *mutableDoc = [[CBLMutableDocument alloc] init]; [mutableDoc setFloat:2.0 forKey:@"version"]; [mutableDoc setString:@"SDK" forKey:@"type"];
// 将Document保存到数据库database [database saveDocument:mutableDoc error:&error];
|
说明(CBLMutableDocument的创建方式):
- [[CBLMutableDocument alloc] init];----此处为随机到document-id
- [[CBLMutableDocument alloc] initWithID:@“document-id”];---指定固定的id,可用于数据更新
3.6 CBLQueryExpression、CBLQuery、CBLQueryResult(数据查询相关)
CBLQueryExpression(查询数据表达式-查询条件-如下:查询数据库中type的值是SDK符合条件的结果)
1
| CBLQueryExpression *type = [[CBLQueryExpression property:@"type"] equalTo:[CBLQueryExpression string:@"SDK"]];
|
CBLQuery(查询语句)
查询所有
1 2
| CBLQuery *query = [CBLQueryBuilder select:@[[CBLQuerySelectResult all]] from:[CBLQueryDataSource database:database]];
|
查询CBLQueryExpression条件的(where后面的type)
1 2 3
| CBLQuery *query = [CBLQueryBuilder select:@[[CBLQuerySelectResult all]] from:[CBLQueryDataSource database:database] where:type];
|
CBLQueryResult(查询结果)
执行query execute即可得到CBLQueryResult查询结果,通过如下的语句即可查询有几条符合结果
1
| [result allResults] count]
|
3.6 关闭数据库
1 2
| if (![self.database close:&error]) NSLog(@"Error closing db:%@", error);
|
四 Couchbase数据库示例(同之前类似- CRUD)
同之前数据操作示例类似,项目结构图(数据实体类:VersionInfo,数据库工具类:CouchbaseTools)
4.1 数据库操作实体类(VersionInfo)
1 2 3 4 5 6 7 8
| #import <Foundation/Foundation.h>
@interface VersionInfo : NSObject @property(nonatomic,strong) NSString *version; @property(nonatomic,strong) NSString *type; @property(nonatomic,strong) NSString *time;
@end
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #import <Foundation/Foundation.h> #include <CouchbaseLite/CouchbaseLite.h>
@class VersionInfo;
@interface CouchBaseTools : NSObject //创建数据库 +(void)createDatabase; //添加数据 +(void)insertVersionInfo:(VersionInfo *)versionInfo; //查询数据 +(NSMutableArray*)queryTable; //更新数据 +(void)updateVersionInfo:(VersionInfo *)versionInfo;
//删除数据库 +(void)deleteTable; @end
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| #import "CouchBaseTools.h" #import "VersionInfo.h" #include <CouchbaseLite/CouchbaseLite.h>
@implementation CouchBaseTools
static CBLDatabase *database; NSError *error;
//使用给定名称和默认数据库配置初始化数据库对象。 //如果数据库尚不存在,将创建该数据库 + (void)initialize{ NSError *error; database = [[CBLDatabase alloc] initWithName:@"mydb" error:&error]; if (error) { NSLog(@"数据库创建失败"); }else{ NSLog(@"数据库创建成功"); } }
//创建数据库 +(void)createDatabase { [self initialize]; } //添加数据 +(void)insertVersionInfo:(VersionInfo *)versionInfo { // 在数据库中创建Doccument. //CBLMutableDocument *mutableDoc = [[CBLMutableDocument alloc] init];//此处为随机到document-id,为了方便管理,使用initWithID CBLMutableDocument *mutableDoc = [[CBLMutableDocument alloc] initWithID:versionInfo.time]; [mutableDoc setString:versionInfo.version forKey:@"version"]; [mutableDoc setString:versionInfo.type forKey:@"type"]; [mutableDoc setString:versionInfo.time forKey:@"time"];
NSError *error; // 保存数据 BOOL success= [database saveDocument:mutableDoc error:&error]; if(success){ NSLog(@"添加数据成功"); }else { NSLog(@"添加数据失败"); } } //查询数据 +(NSMutableArray*)queryTable { //集合 NSMutableArray *array = [NSMutableArray array]; NSError *error; //此处为条件查找,可放到from的后面 where type CBLQueryExpression *type = [[CBLQueryExpression property:@"type"] equalTo:[CBLQueryExpression string:@"SDK"]]; CBLQuery *query = [CBLQueryBuilder select:@[[CBLQuerySelectResult all]] from:[CBLQueryDataSource database:database]]; // 执行查询语句 CBLQueryResultSet *result = [query execute:&error]; NSArray<CBLQueryResult*> *results=[result allResults];//查询结果 //将查询结果转换为实体类 for (CBLQueryResult* result in results) { NSString *type= [[result.toDictionary allValues][0] valueForKey:@"type"]; NSString *version= [[result.toDictionary allValues][0] valueForKey:@"version"]; NSString *time= [[result.toDictionary allValues][0] valueForKey:@"time"]; VersionInfo *versionInfo=[[VersionInfo alloc]init]; versionInfo.type=type; versionInfo.version=version; versionInfo.time=time; //将结果添加到集合 [array addObject:versionInfo]; } return array; }
+(void)updateVersionInfo:(VersionInfo *)versionInfo {
NSError *error; //CBLMutableDocument *document= [CBLMutableDocument documentWithID:@"versionID"]; // CBLMutableDocument *doc1= [CBLMutableDocument documentWithID:time]; //CBLMutableDocument *document= [CBLMutableDocument documentWithID:versionInfo.time];
NSString *time=versionInfo.time; NSLog(@"%@",versionInfo.time); CBLMutableDocument *document= [[database documentWithID:versionInfo.time] toMutable];
if (document) { [document setString:@"App" forKey:@"type"]; BOOL success= [database saveDocument:document error:&error]; if (success) { NSLog(@"数据更新成功"); }else{ NSLog(@"数据更新失败"); } }else{ NSLog(@"document为空"); } } //删除数据库 +(void)deleteTable { NSError *error; BOOL success= [database delete:&error]; if (success) { NSLog(@"数据库删除成功"); }else{ NSLog(@"数据库删除失败"); } } @end
|
4.3 ViewController(按钮点击相关方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #import "ViewController.h" #import "CouchBaseTools.h" #import "VersionInfo.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (IBAction)createDatabase { [CouchBaseTools createDatabase]; } //1-添加数据 - (IBAction)insertVersionInfo { VersionInfo *versionInfo=[[VersionInfo alloc]init]; NSString *version=[NSString stringWithFormat:@"%u",arc4random()%10] ; versionInfo.version=version; versionInfo.type=@"SDK"; versionInfo.time=[self.class getCurrentTime]; [CouchBaseTools insertVersionInfo:versionInfo]; } //查询数据 - (IBAction)queryTable { NSMutableArray *results = [CouchBaseTools queryTable]; //NSLog(@"%@",results); for (VersionInfo* versionInfo in results) { NSLog(@"VersionInfo:type=%@,version=%@,time=%@",versionInfo.type,versionInfo.version,versionInfo.time); }
} - (IBAction)updateTable { NSMutableArray *results = [CouchBaseTools queryTable]; //NSLog(@"%@",results);
//修改所有的VersionInfo-type for (VersionInfo* versionInfo in results) { versionInfo.type=@"App"; [CouchBaseTools updateVersionInfo:versionInfo]; }
//修改第一个VersinInfo-type // VersionInfo *versionInfo=(VersionInfo *)results[0]; // versionInfo.type=@"App"; // [CouchBaseTools updateVersionInfo:versionInfo]; //查询 //[self queryTable]; } - (IBAction)deleteTable { [CouchBaseTools deleteTable]; } +(NSString *)getCurrentTime { //获取标准时间 NSDate *date = [NSDate date]; [[NSDate date]timeIntervalSince1970]; //使用formatter格式化后的时间 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"]; NSString *time_now = [formatter stringFromDate:date]; return time_now; } @end
|
4.4 Couchbase相关
Couchbase位置:沙盒路径/Library/Application Support/CouchbaseLite/mydb.cblite2
数据库的结构
Kv-default |
Kv-info |
Kv-meeta |
|
|
|
3.5 执行按钮相关的CRUD操作
说明:
- 数据库创建成功:执行了点击创建数据库按钮或者默认初始化
- 添加数据成功:点击了添加数据按钮(点击一次添加一个数据)
- VersionInfo(3条记录):执行了点击查询按钮,且所有的type为SDK
- 数据更新成功(3条记录):点击了更新按钮(将所有VersionInfo的type改为App)
- VersionInfo(3条记录):执行了点击查询按钮,且所有的type为App
五 参考
Github-CouchBase-OC示例