WCDB 是腾讯开源的移动数据库框架,官网:https://github.com/Tencent/wcdb。
和fmdb相比,主要是它支持ORM,用c++编写的,效率更高并且还是跨平台的,既可以在iOS上使用也可以在Android上使用。
使用Cocoapods 安装,pod ‘WCDB’,其他安装方式请参考https://github.com/Tencent/wcdb/wiki
1、在ORM中,一个模型类对应一张表,一个类对象对应表里的一条数据,属性对应表里字段,先新建一个用户的模型类,如下:
DBModel.h
#import <Foundation/Foundation.h>
#import <WCDB/WCDB.h>
NS_ASSUME_NONNULL_BEGIN
@interface DBModel : NSObject <WCTTableCoding>
@property int user_id;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
WCDB_PROPERTY(user_id)
WCDB_PROPERTY(name)
WCDB_PROPERTY(age)
@end
NS_ASSUME_NONNULL_END
//DBModel.m
#import "DBModel.h"
@implementation DBModel
WCDB_IMPLEMENTATION(DBModel)
WCDB_SYNTHESIZE(DBModel, name)
WCDB_SYNTHESIZE(DBModel, age)
WCDB_SYNTHESIZE(DBModel, user_id)
WCDB_PRIMARY_AUTO_INCREMENT(DBModel, user_id)
- (NSString *)description
{
return [NSString stringWithFormat:@"姓名:%@ 年龄:%@", self.name,@(self.age)];
}
@end
2、创建数据库,创建一个user表
- (WCTDatabase *)database {
static WCTDatabase *db = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
db = [[WCTDatabase alloc] initWithPath:[docDir stringByAppendingPathComponent:@"my_db"]];
if ([db canOpen]) {
[db createTableAndIndexesOfName:@"user" withClass:[DBModel class]];
//如果表不存在就创建表,如果字段有更新,就更新表,所以不用判断是否已经存在该表
}
});
_database = db;
return _database;
}
增:
DBModel *model = [[DBModel alloc] init];
model.isAutoIncrement = YES; // 如果你的模型里使用了WCDB_PRIMARY_AUTO_INCREMENT,就要把该属性设置为YES,否则会报错
model.age = age;
model.name = name;
if ([self.database insertObject:model into:@"user"]) {
[_dataArray addObject:model];
}
删:
[self.database deleteObjectsFromTable:@"user" where:DBModel.user_id.is(model.user_id)]
改:
model.age = age;
model.name = name;
//因为user_id 是主键,有唯一性,修改的时候如果使用DBModel.AllProperties,会报错,使用{}把需要修改的属性括起来就可以了
if ([self.database updateAllRowsInTable:@"user" onProperties:{DBModel.age ,DBModel.name} withObject:model]) {
NSLog(@"修改成功");
}
查:
[self.database getAllObjectsOfClass:DBModel.class fromTable:@"user"];//查询所有
[self.database getOneObjectOfClass:DBModel.class fromTable:@"user" where:DBModel.user_id.is(1)];//按条件查询