SQLite的使用——OC代码
2017-03-26 21:36
211 查看
一、添加”libsqlite3.dylib”库文件
二、代码结构
三、代码实现
1.AppDelegate.m#import "AppDelegate.h" #import "SQLiteManager.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { BOOL flag = [[SQLiteManager shareInstance] openDB]; if (flag) { NSLog(@"打开数据库成功"); } else { NSLog(@"打开数据库失败"); } return YES; } @end
2.ViewController.m
#import "ViewController.h" #import "SQLiteManager.h" #import "Student.h" @interface ViewController () <UISearchBarDelegate> /* 关键字搜索出来的数据 */ @property (nonatomic, strong) NSArray *listData; @end @implementation ViewController /* 0.封装一个工具类,管理SQLite的数据库(单例) 1.创建数据库(文件) 2.创建表,用于存储数据 3.基本操作(增删改) 4.查询数据 */ - (void)viewDidLoad { [super viewDidLoad]; // 添加搜索框 UISearchBar *searchBar = [[UISearchBar alloc] init]; searchBar.frame = CGRectMake(0, 0, self.view.bounds.size.width, 44); self.tableView.tableHeaderView = searchBar; searchBar.delegate = self; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSArray *students = [Student loadData]; NSLog(@"%@", students); } - (void)deleteData { // 1.删除的SQL NSString *deleteSQL = @"DELETE FROM t_student WHERE age = 24;"; // 2.执行SQL if ([[SQLiteManager shareInstance] execSQL:deleteSQL]) { NSLog(@"删除数据成功"); } } - (void)updateData { // 1.更新的SQL NSString *updateSQL = @"UPDATE t_student SET name = 'zs2' WHERE id = 1;"; // 2.执行sql if ([[SQLiteManager shareInstance] execSQL:updateSQL]) { NSLog(@"更新数据成功"); } } #pragma mark - 实现UISearchBar的代理方法 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { // 1.拿到关键字,查询学生数据 self.listData = [Student loadDataWithKeyword:searchText]; // 2.刷新表格 [self.tableView reloadData]; } #pragma mark - 实现tableView的数据源方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.listData.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"MenuCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } Student *stu = self.listData[indexPath.row]; cell.textLabel.text = stu.name; return cell; } @end
3.SQLiteManager.h
#import <Foundation/Foundation.h> @interface SQLiteManager : NSObject + (instancetype)shareInstance; - (BOOL)openDB; - (BOOL)execSQL:(NSString *)sql; - (NSArray *)querySQL:(NSString *)querySQL; @end
4.SQLiteManager.m
#import "SQLiteManager.h" #import <sqlite3.h> @interface SQLiteManager () @property (nonatomic, assign) sqlite3 *db; @end @implementation SQLiteManager static id _instance; + (instancetype)shareInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } #pragma mark - 创建或者打开数据库 - (BOOL)openDB { // 获取沙盒路径,将数据库放入沙盒中 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; filePath = [filePath stringByAppendingPathComponent:@"my.sqlite"]; // 如果有对应的数据库,则打开对应的数据库.如果没有对应的数据库,则创建数据库 // 1> 参数一:文件路径(数据库的存放路径) // 2> 参数二:操作数据库的对象 if (sqlite3_open(filePath.UTF8String, &_db) != SQLITE_OK) { NSLog(@"打开数据库失败"); return NO; } // 如果打开数据成功,则创建一张表,用于之前存放数据 return [self createTable]; } - (BOOL)createTable { // 1.定义创建表的SQL语句 NSString *createTableSQL = @"CREATE TABLE IF NOT EXISTS 't_student' ('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);"; // 2.执行SQL语句 return [self execSQL:createTableSQL]; } - (BOOL)execSQL:(NSString *)sql { // 执行sql语句 // 1> 参数一:数据库sqlite3对象 // 2> 参数二:执行的sql语句 return sqlite3_exec(self.db, sql.UTF8String, nil, nil, nil) == SQLITE_OK; } #pragma mark - 查询数据 - (NSArray *)querySQL:(NSString *)querySQL { // 定义游标对象 sqlite3_stmt *stmt = nil; // 准备工作(获取查询的游标对象) // 1> 参数三:查询语句的长度, -1自动计算 // 2> 参数四:查询的游标对象地址 if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) { NSLog(@"没有准备成功"); return nil; } // 取出某一个行数的数据 NSMutableArray *tempArray = [NSMutableArray array]; // 获取字段的个数 int count = sqlite3_column_count(stmt); while (sqlite3_step(stmt) == SQLITE_ROW) { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (int i = 0; i < count; i++) { // 1.取出当前字段的名称(key) NSString *key = [NSString stringWithUTF8String:sqlite3_column_name(stmt, i)]; // 2.取出当前字段对应的值(value) const char *cValue = (const char *)sqlite3_column_text(stmt, i); NSString *value = [NSString stringWithUTF8String:cValue]; // 3.将键值对放入字典中 [dict setObject:value forKey:key]; } [tempArray addObject:dict]; } // 不再使用游标时,需要释放对象 sqlite3_finalize(stmt); return tempArray; } @end
5.Student.h
#import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; - (instancetype)initWithDict:(NSDictionary *)dict; - (void)insertStudent; + (NSArray *)loadData; + (NSArray *)loadDataWithKeyword:(NSString *)keyword; @end
6.Student.m
#import "Student.h" #import "SQLiteManager.h" @implementation Student - (instancetype)initWithDict:(NSDictionary *)dict { if (self = [super init]) { [self setValuesForKeysWithDictionary:dict]; } return self; } - (void)insertStudent { // 1.通过属性拼接出来,插入语句 NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO t_student (name, age) VALUES ('%@', %ld);", self.name, self.age]; // 2.执行该sql语句 if ([[SQLiteManager shareInstance] execSQL:insertSQL]) { NSLog(@"插入数据成功"); } } + (NSArray *)loadData { // 1.封装查询语句 NSString *querySQL = @"SELECT name, age FROM t_student;"; return [self loadDataWithQuerySQL:querySQL]; } + (NSArray *)loadDataWithKeyword:(NSString *)keyword { // 1.封装查询语句 NSString *querySQL = [NSString stringWithFormat:@"SELECT name, age FROM t_student WHERE name like '%%%@%%';", keyword]; return [self loadDataWithQuerySQL:querySQL]; } + (NSArray *)loadDataWithQuerySQL:(NSString *)querySQL { // 2.执行查询语句 NSArray *dictArray = [[SQLiteManager shareInstance] querySQL:querySQL]; // 3.将数组中的字典转成模型对象 NSMutableArray *stus = [NSMutableArray array]; for (NSDictionary *dict in dictArray) { [stus addObject:[[Student alloc] initWithDict:dict]]; } return stus; } @end
相关文章推荐
- SQLite在android中的使用,以及常用增删查改的命令代码!
- Android SQLite数据库使用 学习与代码实践
- 黑马程序员——OC基础学习(三)---从传统setter方法和getter方法到@property增强型使用(体验代码的优化过程)
- 使用Cocos2d-x的LuaBridge接入OC代码时需要注意的问题
- 数据库sqlite3的使用-代码实例应用
- OC - UIStackView 的使用,纯代码方式
- OC开发_代码片段——使用Xib自定义tableViewCell
- C语言与OC中常见的字符串函数及其代码和使用
- iOS 使用WKWebView替换UIWebView(二)——代码实战(包括OC与JS互调)
- ndk开发:使用android系统的libsqlite.so编译代码
- Android SQLite数据库使用 学习与代码实践
- 在代码使用数据库SQLite的
- xcode6 中使用OC代码时,在NSObject的子类中报错
- SQLite的基本使用-示例代码
- sqlite3的使用代码
- OC基本功(二)使用宏在程序中加入测试代码
- iOS 使用UIWebView把oc代码和javascript相关联
- APP开发的干货 - 1、使用OC的代码规范
- 在oc代码中使用swift第三方框架