iOS中 DataBase SQL数据库 UI_高级
Student.h
@interface Student : NSObject
@property(nonatomic,assign)NSInteger number;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *gender;
@property(nonatomic,assign)NSInteger age;
@end
Student.m
@implementation Student
- (void)dealloc{
self.name = nil;
self.gender = nil;
[super dealloc];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%ld %@ %@ %ld", self.number,self.name,self.gender,self.age];
}
@end
通过单例写接口并实现方法:
DataBaseHandle.h @class Student; @interface DataBaseHandle : NSObject //创建单例的方法 + (DataBaseHandle *)shareDataBaseHandle; //打开数据库的方法 - (void)openDataBase; //关闭数据库的方法 - (void)closeDataBase; //插入学生对象的接口 - (void)insertStudent : (Student *)student; //返回表格中所有学生的接口 - (NSMutableArray *)selectAllStudent; //根据唯一标识学号删除学生 - (void)deleteOneStudentByNumber : (NSInteger )number; //根据唯一标识学号修改学生的姓名 - (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number; //根据学号查找学生 - (Student *)selectOneStudentByNumber : (NSInteger)number; @end
DataBaseHandle.m
#import "DataBaseHandle.h"
#import <sqlite3.h>
#import "Student.h"
@implementation DataBaseHandle
static DataBaseHandle *handle = nil;
//创建单例的方法
+ (DataBaseHandle *)shareDataBaseHandle{
@synchronized(self){
if (handle == nil) {
handle = [[DataBaseHandle alloc]init];
//让单例对象一创建后就可以访问数据库
[handle openDataBase];
}
}
return handle;
}
//返回数据库路径
- (NSString *)dataBasePath{
//将数据库文件放到Documents文件夹下 student.sqlite
return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"student.sqlite"];
}
定义一个全局且在静态区的数据库指针
static sqlite3 *db = nil;
打开数据库的方法
- (void)openDataBase{
//1.先获取数据文件的路径
NSString *dbPath = [self dataBasePath];
//使用sql之前一定要导入libsqlite3.0动态链接类库,其中libsqlite.3.0是快捷方式,导入快捷方式的好处,当版本更新的时候,不再导入新的实体类库了,因为快捷方式永远指向的是最新的实体类库(记得导入头文件)
//2.使用sql语句打开数据库
//[dbPath UTF8String] 将OC字符串转化为C语言字符串
//sqlite3 就是数据库指针
//创建数据库指针db
// sqlite3 *db = nil;
//方法执行完,内不会对数据库指针db进行初始化,方法执行完,就会存在数据库文件
//此方法会先检测文件路径中有没有对应的数据库文件,没有则创建,有的话直接打开
int result = sqlite3_open([dbPath UTF8String], &db);
//SQLITE_OK 说明sql是成功
if (result == SQLITE_OK) {
// NSLog(@"数据库打开成功");
//创建表格
//准备sql语句
NSString *sqlString = @"create table if not exists Student(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer)";
//执行sql语句
sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL);
}else{
NSLog(@"数据库打开失败");
}
}
关闭数据库的方法
- (void)closeDataBase{
int result = sqlite3_close(db);
NSLog(@"%@",(result == SQLITE_OK) ? @"关闭成功":@"关闭失败");
}
插入学生对象的接口——增
- (void)insertStudent : (Student *)student{
//1.打开数据库
[self openDataBase];
//2.准备插入的sql语句
NSString *sqlString = @"insert into Student(stu_name,stu_gender,stu_age)values(?,?,?)";
//3.创建数据库管理指针(数据库管理指令集)
sqlite3_stmt *stmt = nil;
//4.验证sql语句是否正确
//参数1:数据库指针,
//参数2:sql语句
//参数3:sql语句的长度写成-1,自动计算sql语句的最大长度,否则要自己计算长度
//参数4:sql语句的管理指针
//参数5:预留参数,未来使用
//5.拿验证的结果,判断是否执行参数绑定的操作
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"插入成功");
//参数1:sql语句管理指针
//参数2:上面sql语句中 ?的位置,?的下标从1开始
//参数3:要绑定的数据
//参数4:数据的长度
//绑定字段stu_name 的数据
sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL);
//绑定字段stu_gender 的数据
sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL);
//绑定字段stu_age 的数据
sqlite3_bind_int(stmt, 3, (int)student.age);
//6.让sql语句执行
sqlite3_step(stmt);
}
//7.释放掉管理指针
sqlite3_finalize(stmt);
//8.关闭数据库
[self closeDataBase];
}
返回表格中所有学生的接口——查1
- (NSMutableArray *)selectAllStudent{
//1.打开数据库
[self openDataBase];
//2.准备sql语句
NSString *sqlString = @"select * from Student";
//3.创建管家指针
sqlite3_stmt *stmt = nil;
//4.验证sql语句是否正确
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
if (SQLITE_OK == result) {
NSLog(@"查找全部语句成功");
//创建可变数组存储找到所有的学生对象
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
//SQLITE_ROW 如果等于row说明下一行是有数据的,循环继续,如果不等于SQLITE_ROW ,说明下一行没有数据了,循环结束
while (sqlite3_step(stmt) == SQLITE_ROW) {
//依次读出字段的数据
//列的编号是从零开始的
//第一列
int number = sqlite3_column_int(stmt, 0);
//第二列
NSString *name = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1) ];
//第三列
NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
//第四列
int age = sqlite3_column_int(stmt, 3);
//5.创建学生对象并赋值
Student *stu = [[Student alloc]init];
stu.number = number;
stu.name = name;
stu.gender = gender;
stu.age = age;
//添加到数组
[array addObject:stu];
//释放
[stu release];
}
//6.释放管理指针
sqlite3_finalize(stmt);
//关闭数据库
[self closeDataBase];
return array;
}else{
sqlite3_finalize(stmt);
[self closeDataBase];
return nil;
}
}
根据学号查找学生——查2
- (Student *)selectOneStudentByNumber : (NSInteger)number{
//1.打开数据库
[self openDataBase];
//2.准备sql语句
NSString *sqlString = @"select * from Student where stu_number = ?";
//3.创建管理指针
sqlite3_stmt *stmt = nil;
//4.验证sql语句是否正确
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
//5.根据验证结果决定执行什么操作
if (result == SQLITE_OK) {
//6.绑定参数
sqlite3_bind_int(stmt, 1, (int)number);
//7.遍历表格中的数据
//创建model学生对象存储找到的学生信息
Student *stu = [[Student alloc]init];
while (sqlite3_step(stmt) == SQLITE_ROW) {
//根据找到的数据给学生的属性赋值
stu.number = number;
stu.name =[NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1)];
stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
stu.age = sqlite3_column_int(stmt, 3);
}
//8.释放管理指针
sqlite3_finalize(stmt);
//9.关闭数据库
[self closeDataBase];
return [stu autorelease];
}else{
//10.释放管理指针
sqlite3_finalize(stmt);
//11.关闭数据库
[self closeDataBase];
}
return nil;
}
根据唯一标识学号删除学生——删
- (void)deleteOneStudentByNumber : (NSInteger )number{
//1.打开数据库
[self openDataBase];
//2.准备删除sql语句
NSString *sqlString = @"delete from Student where stu_number = ?";
//3.创建数据库管理指针
sqlite3_stmt *stmt = nil;
//4.验证sql语句是否正确
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
//5.判断是否执行参数绑定的操作
if (result == SQLITE_OK) {
//6.绑定传过来的参数
sqlite3_bind_int(stmt, 1, (int)number);
//7.执行sql语句
sqlite3_step(stmt);
}
//8.释放掉管理指针
sqlite3_finalize(stmt);
//9.关闭数据库
[self closeDataBase];
}
根据唯一标识学号修改学生的姓名——改
- (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number{
//1.打开数据库
[self openDataBase];
//2.准备sql语句
NSString *sqlString = @"update Student set stu_gender = ? where stu_number = ?";
//3.创建数据库管理指针
sqlite3_stmt *stmt = nil;
//4.验证sql语句
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
//5.根据验证的结果决定执行的操作
if (result == SQLITE_OK) {
//6.绑定参数
sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL);
//7.绑定学号
//第二个参数:是 ? 在sql语句中位置,位置从1开始
sqlite3_bind_int(stmt, 2, (int)number);
//8.执行sql语句
sqlite3_step(stmt);
}
//9.释放管理指针
sqlite3_finalize(stmt);
//10.关闭数据库
[self closeDataBase];
}
方法的调用:
ViewController.m
#import "ViewController.h" #import "DataBaseHandle.h" #import "Student.h" @interface ViewController () @property (retain, nonatomic) IBOutlet UITextField *numberField;//学号 @property (retain, nonatomic) IBOutlet UITextField *nameField;//姓名 @property (retain, nonatomic) IBOutlet UITextField *genderField;//性别 @property (retain, nonatomic) IBOutlet UITextField *ageField;//年龄 @end
1、添加:增
- (IBAction)insertStudent:(UIButton *)sender {
//判断有一个控件中输入的内容为空,就不让它插入数据
if (0 == self.nameField.text.length || 0 == self.genderField.text.length || 0 == self.ageField.text.length) {
return;
}
//创建学生Student 对象,存储空间中输入的内容
Student *stu = [[Student alloc]init];
stu.name = self.nameField.text;
stu.gender = self.genderField.text;
stu.age = [self.ageField.text integerValue];
[[DataBaseHandle shareDataBaseHandle]insertStudent:stu];
[stu release];
}
2、更新学生信息:改
- (IBAction)updateStudent:(UIButton *)sender {
//获取输入框的内容
NSInteger number = [self.numberField.text integerValue];
NSString *gender = self.genderField.text;
//调用根据学号修改gender的方法
[[DataBaseHandle shareDataBaseHandle]updateStudentGender:gender ByNumber:number];
}
3、删除学生:删
- (IBAction)deleteStudent:(UIButton *)sender {
NSInteger number = [self.numberField.text integerValue];
//调用根据学号删除学生的方法
[[DataBaseHandle shareDataBaseHandle]deleteOneStudentByNumber:number];
}
4、查找全部学生:查1
- (IBAction)selectAllStudent:(UIButton *)sender {
//调用寻找所有学生
NSMutableArray *contentArray = [[DataBaseHandle shareDataBaseHandle]selectAllStudent];
for (Student *stu in contentArray) {
NSLog(@"%@",stu);
}
}
5、查找某个学生:查2
- (IBAction)selectOneStudent:(id)sender {
//获取学号输入框的内容
NSInteger number = [self.numberField.text integerValue];
//调用根据学号获取学生对象
Student *stu = [[DataBaseHandle shareDataBaseHandle]selectOneStudentByNumber:number];
NSLog(@"%@",stu);
}
记得释放:
- (void)dealloc {
[_numberField release];
[_nameField release];
[_genderField release];
[_ageField release];
[super dealloc];
}
总结:一般步骤:1、打开数据库;2、准备sql语句;3、创建管家指针;4、验证sql语句是否正确;5、根据验证结果决定执行什么操作;6、绑定参数;7、遍历表格中的数据(根据学号查找学生);8、释放管理指针;9、关闭数据库
iOS中 DataBase SQL数据库 UI_高级的更多相关文章
- iOS - SQLite Database 操作数据库
iOS - SQLite Database 操作数据库 Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...
- IOS中使用轻量级数据库
IOS中使用轻量级数据库 目录 概述 IOS中的轻量级数据库 sqlite的方法 数据库的实用操作 第三方类库 FMDatabase 概述 IOS中的轻量级数据库 sqlite的方法 sqlite3 ...
- SQL数据库— <3>高级查询、常用函数 --摘录网络
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; --all 查询所有 ...
- Unity中对SQL数据库的操作
在Unity中,我们有时候需要连接数据库来达到数据的读取与储存.而在.NET平台下,ADO.NET为我们提供了公开数据访问服务的类.客户端应用程序可以使用ADO.NET来连接到数据源,并查询,添加,删 ...
- 关于Golang中database/sql包的学习
go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...
- 李洪强iOS开发之-sql数据库的使用
一,创建工程 二: 导入头文件 三:导入 四: 数据库增删改查 //因为是结构体类型,所以用assign //1.创建数据库(保存路径) @property(nonatomic,assign)sqli ...
- Oracle配置OneMap中的sql数据库问题及解决方案
报错ORA-00900:无效SQL语句,点确定后报错:ORA--00942:表或视图不存在 分析:prompt在Oracle中是打印功能,如果要在PLsql中执行带有prompt的sql文件就会报上面 ...
- Golang中database/sql包
驱动 github.com/go-sql-driver/mysql 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. d ...
- ASP.NET中操作SQL数据库
在WebConfig中配置数据库连接字符串,代码如下: <connectionStrings> <add name="ConnectionString&qu ...
随机推荐
- java底层学习
额,马上就要面试了,Java的底层肯定是需要了解的.网上找了找java的底层文章,做个记号.java底层主要是类的加载.连接和初始化. 本文主要分为四个方面: (1)java底层概述 (2)new和n ...
- ubuntu批量更改文件权限
重装系统之后,把文件从windows分区拷到linux分区发现所有文件的权限全是777,在终端下看到所有文件的颜色都很刺眼,文件有很多,一个一个改不现实,所以写了一段python脚本批量更改文件权限. ...
- joomla网站内插入doc文档
最近我的网站又出了问题,之前用joomla做的网站,由于要放doc文档,后来想尽办法终于用iframe的办法,先把文档传到scribd网,然后把文档嵌到网站里去,但是狗血的,去年五月份的时候我们伟大的 ...
- vue.js-路由
1:编写router.js import Router from "vue-router" import Vue from "vue" import rou ...
- python的模块与包的导入
类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...
- day06_JDBC学习笔记
============================================================ 一.JDBC概述 为什么要使用JDBC? JDBC:Java DataBase ...
- init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别
1.init 与initialize 对于iOS程序,创建几个类对象,就会调用几次init.下面分别重写 举例如下: 创建一个Person类,分别重写initialize和init方法 #import ...
- 利用百度接口进行人脸识别并保存人脸jpg文件
利用百度接口进行人脸识别,根据返回的人脸location用opencv切割保存. # coding : UTF-8 from aip import AipFace import cv2 import ...
- Linux系统网络性能实例分析
由于TCP/IP是使用最普遍的Internet协议,下面只集中讨论TCP/IP 栈和以太网(Ethernet).术语 LinuxTCP/IP栈和 Linux网络栈可互换使用,因为 TCP/IP栈是 L ...
- Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...