User.h文件
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *password;
@property (nonatomic, assign) NSUInteger age;
@end
DataBaseManager.h文件
#import <Foundation/Foundation.h>
#import "User.h"
@interface DataBaseManager : NSObject
+ (instancetype)shareManager;
- (BOOL)addUser:(User *)user;
- (BOOL)updateUser:(User *)user;
- (BOOL)deleteUser:(User *)user;
- (User *)searchUser:(NSString *)username;
- (NSArray *)searchuserFromAge:(NSUInteger)fAge toAge:(NSUInteger)tAge;
- (NSArray *)allUsers;
- (BOOL)logInWithUsername:(NSString *)username Password:(NSString *)password;
- (NSUInteger)userCount;
@end
DataBaseManager.h.m文件
#import "DataBaseManager.h"
#import <sqlite3.h>
#define kDataBaseFilePath [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/User.sqlite"]
单例实现
+ (instancetype)shareManager {
static DataBaseManager *manager = nil;
if (manager == nil) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[super allocWithZone:nil] init];
});
}
return manager;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [self shareManager];
}
- (instancetype)copy {
return self;
}
DDL语句应用 初始化时创建数据库文件,创建表格
- (instancetype)init {
NSLog(@"%@", kDataBaseFilePath);
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:kDataBaseFilePath]) {
return self;
}
[manager createFileAtPath:kDataBaseFilePath contents:nil attributes:nil];
sqlite3 *sqlite = NULL;
int result = sqlite3_open([kDataBaseFilePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"数据库打开失败");
[manager removeItemAtPath:kDataBaseFilePath error:nil];
return nil;
}
NSString *sqlString = @"CREATE TABLE user(username text PRIMARY KEY, password text NOT NULL, age integer DEFAULT 18)";
sqlite3_exec(sqlite, [sqlString UTF8String], NULL, NULL, NULL);
sqlite3_close(sqlite);
return self;
}
DML语句应用 添加用户
- (BOOL)addUser:(User *)user {
sqlite3 *sqlite = NULL;
int result = sqlite3_open([kDataBaseFilePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"数据库打开失败");
return NO;
}
NSString *sqlString = @"INSERT INTO user (username,password,age) VALUES (?,?,?)";
sqlite3_stmt *stmt = NULL;
result = sqlite3_prepare_v2(sqlite, [sqlString UTF8String], -1, &stmt, NULL);
if (result != SQLITE_OK) {
NSLog(@"语句编译失败");
sqlite3_close(sqlite);
return NO;
}
sqlite3_bind_text(stmt, 1, [user.username UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [user.password UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 3, (int)user.age);
result = sqlite3_step(stmt);
if (result != SQLITE_DONE) {
NSLog(@"数据插入失败");
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return NO;
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return YES;
}
DQL语句应用 所有用户
- (NSArray *)allUsers {
sqlite3 *sqlite = NULL;
int result = sqlite3_open([kDataBaseFilePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"数据库打开失败");
return nil;
}
NSString *sqlString = @"SELECT username,age FROM user";
sqlite3_stmt *stmt = NULL;
result = sqlite3_prepare_v2(sqlite, [sqlString UTF8String], -1, &stmt, NULL);
if (result != SQLITE_OK) {
NSLog(@"编译失败");
sqlite3_close(sqlite);
return nil;
}
NSMutableArray *array = [[NSMutableArray alloc] init];
while(sqlite3_step(stmt) == SQLITE_ROW) {
User *user = [[User alloc] init];
user.username = [NSString stringWithFormat:@"%s", sqlite3_column_text(stmt, 0)];
user.age = sqlite3_column_int(stmt, 1);
[array addObject:user];
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return [array copy];
}
DQL语句应用 用户登录
- (BOOL)logInWithUsername:(NSString *)username Password:(NSString *)password {
sqlite3 *sqlite = NULL;
int result = sqlite3_open([kDataBaseFilePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"数据库打开失败");
return NO;
}
NSString *sqlString = @"SELECT count(*) FROM user WHERE username=? AND password=?";
sqlite3_stmt *stmt = NULL;
result = sqlite3_prepare_v2(sqlite, [sqlString UTF8String], -1, &stmt, NULL);
if (result != SQLITE_OK) {
NSLog(@"编译失败");
return NO;
}
sqlite3_bind_text(stmt, 1, [username UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [password UTF8String], -1, NULL);
if (sqlite3_step(stmt) == SQLITE_ROW) {
if (sqlite3_column_int(stmt, 0) > 0) {
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return YES;
}
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return NO;
}
DQL语句应用 用户个数
- (NSUInteger)userCount {
sqlite3 *sqlite = NULL;
int result = sqlite3_open([kDataBaseFilePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"数据库打开失败");
return NO;
}
NSString *sqlString = @"SELECT count(*) FROM user";
sqlite3_stmt *stmt = NULL;
result = sqlite3_prepare_v2(sqlite, [sqlString UTF8String], -1, &stmt, NULL);
if (result != SQLITE_OK) {
NSLog(@"编译失败");
return NO;
}
if (sqlite3_step(stmt) == SQLITE_ROW) {
NSInteger count = sqlite3_column_int(stmt, 0);
return count;
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
return 0;
}