SQLite的使用——OC代码
来源:互联网 发布:知味记下载 编辑:程序博客网 时间:2024/05/21 10:19
一、添加”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 SQLiteManagerstatic 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
0 0
- SQLite的使用——OC代码
- SQLite的使用—— Swift代码
- OC - UIStackView 的使用,纯代码方式
- OC代码规范的spacecommander使用
- 在代码使用数据库SQLite的
- 代码干货 | ionic sqlite的使用
- OC—— 代码块
- SQLite的使用——bruceyou1990
- ios基础——OC语法代码块的运用
- sqlite代码的编写
- OC中协议、代码块、分类的使用
- OC代码中使用Swift文件的实践
- 【SQLite】SQLite的简单使用
- 黑马程序员—OC(关于OC的一些简单介绍及使用)
- Android中使用SQLite数据库的基础代码结构
- 安卓--SQLite数据库的简单使用(说明+代码)
- sqlite api使用代码实例
- 【sqlite】——使用记录
- C/C++字节对齐
- 删除链表倒数第n个元素
- spring boot注释
- Win7下U盘安装Ubuntu14.04双系统步骤详解
- STL函数代码解释
- SQLite的使用——OC代码
- H5canvas折线图的绘制
- 第六届蓝桥杯牌型种数
- HTTP协议
- 51单片机常用寄存器
- Apache2.4 和 php5.6在win7系统的安装
- 山东理工ACM 1445 素数
- 我的threejs学习笔记(八)——向场景添加颜色监听
- 对于配置环境变量后的过程~