iOS-senior2-数据库

数据库知识点:

2.1数据库的特征

2.2SQL字段的约束条件

#NOT NULL#在数据库中允许除了主键以外其他任何字段为空

#UNIQUE  #表示确定的,只有这个没有其他

#PRIMARY KEY#

1.不为空(not null),唯一性(unique)

2.一个表里可以没有主键,如果设置完主键,这个字段不能为空,不能              重复(最好设置主键,方便查找信息)

#FOREIGN KEY#

1.在MySQL里有个连表查询(两个表以上有关联)就是外边一张表的主键相当于当前表就叫做外键

2.作用:可以查询另外一张表的某条具体的数据

#CHECK#条件检查(没什么用),确保一列中的所有值满足一定条件

#DEFAULT#默认为

#AUTOINCREMENT#自增型变量,当设置一个integer类型的数据字段,它会自增加一

2.3部分基础SQL语句

1.建表(create table 表名)

2.插入(insert into 表名(字段1,字段2,字段3) values (值1,值2,值3))

3.更新(update 表名 set 字段1名 = 修改值1,字段2名 = 修改值2 where 条件)

4.删除(delete from 表名 where 条件)

5.查询(select 要查找的字段 from 表名 where 条件)

2.4延伸---单例

2.5关于数据库操作源代码

DataBaseHandle.h

//创建一个类写成单例,方便外部使用

+(DataBaseHandle *)shareDataBaseHandle;

//打开数据库

- (void) openDB;

//关闭数据库

- (void)closeDB;

//创建表

- (void)createTable;

//插入数据

- (void)insertName:(NSString *)name  gender:(NSString *)gender  age:(NSInteger)age;

//通过uid去更新数据

- (void)updateWithUID:(NSInteger)uid;

//通过uid去删除数据

- (void)deleteWithUID:(NSInteger)uid;

//查找所有数据

- (void)searchAll;

//根据名字去查找相关的数据信息

- (void)searchWithName:(NSString *)name;

DataBaseHandle.m

#import "DataBaseHandle.h"

//引入数据库操作的头文件

#import <sqlite3.h>

//延展定义

@interface DataBaseHandle()

@property (nonatomic,copy) NSString *dbPath;

@end

static DataBaseHandle *dataBase;

@implementation DataBaseHandle 

+(DataBaseHandle *)shareDataBaseHandle {

if (dataBase == nil) {

dataBase = [[DataBaseHandle alloc]init];

}

return dataBase;

}

//懒加载需要给数据库路径赋值

- (NSString *)dbPath {

if (_dbPath == nil) {

//需求:路径存储在Docments文件夹下,数据库文件为person.splite

NSString *documentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

_dbPath = [documentsPath stringByAppendingPathComponent:@"person.sqlite"];

}

return _dbPath;

}

//打开数据库(好多地方都会使用到数据库,所以初始化一个数据库的静态变量)

static sqlite3 *db = nil;

- (void)openDB {

//打开数据库,使用int去接收打开的结果

//第一个参数:filename代表数据库的存储路径

//第二个参数:二级指针,数据库的地址

int result = sqlite3_open([self.dbPath UTF8String], &db);

//result是个枚举值,有很多情况

if (result == SQLITE_OK) {

NSLog(@"数据库打开成功");

}else {

NSLog(@"数据库打开失败");

}

}

//关闭数据库

- (void)closeDB {

int result = sqlite3_open([self.dbPath UTF8String], &db);

if (result == SQLITE_OK) {

NSLog(@"数据关闭成功");

}else {

NSLog(@"数据关闭失败");

}

}

//创建table

- (void)createTable {

//创建一个person表,字段:uid integer类型  主键 自增 不能为空 ,name text类型,gender text类型,age integer类型

NSString *createStr = @"create table person(uid integer primary key autoincrement not null, name text, gender text, age integer)";

//第一个参数:数据库

//第二个参数:sql语句,需要进行编码

//第三个参数:结果回调的函数

//第四个参数:回调函数的一个参数

//第五个参数:回调函数的一个参数

//自己查找(nil和null的区别)

int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);

if (result == SQLITE_OK) {

NSLog(@"创建表成功");

}else {

NSLog(@"创建表失败");

}

//打印数据库路径,检查表是否创建成功

NSLog(@"_dbPath = %@",_dbPath);

}

//插入数据

- (void)insertName:(NSString *)name

gender:(NSString *)gender

age:(NSInteger) age {

//当values不确定的情况下,使用英文下问号?代替,之后会进行其值绑定的过程

NSString *insertStr = @"insert into person (name,gender,age) values (?,?,?)";

//伴随指针

sqlite3_stmt *stmt = nil;

//预执行语句

//第一个参数:数据库

//第二个参数:sql语句

//第三个参数:有正负之分,例如:1.代表只往后读一个字节;如果为负值,遇到特殊符号才会结束读取(\000,u000);

//第四个参数:伴随指针,会随着数据库的相关操作确定其中?的值

//第五个参数:取值的时候取得不全,剩下的值都存在这里

int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL);

if (result == SQLITE_OK) {

//在操作成功的方法里进行?值得一些绑定设置

//第一个参数:伴随指针

//第二个参数:?的位置,从1开始

//第三个参数:表示要插入的值

//第四个参数:和上面的-1一样一样的

//第五个参数:回调函数

sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);

sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);

sqlite3_bind_int64(stmt, 3, age);

//sql语句执行完毕

//执行伴随指针,根据伴随指针的情况判定是否插入成功[SQLITE_DONE代表伴随指针执行数据成功]

if (sqlite3_step(stmt) == SQLITE_DONE) {

NSLog(@"插入成功");

}

else {

NSLog(@"插入失败");

}

}else {

NSLog(@"result = %d",result);

}

//一定要释放伴随指针

sqlite3_finalize(stmt);

}

//通过uid去更新数据

- (void)updateWithUID:(NSInteger)uid {

//伴随指针

sqlite3_stmt *stmt = nil;

NSString *updateStr = @"update person set name =‘afu‘ where uid = ? ";

int result = sqlite3_prepare(db, updateStr.UTF8String, -1 , &stmt,NULL);

if (result == SQLITE_OK) {

sqlite3_bind_int64(stmt, 1, uid);

if (sqlite3_step(stmt) == SQLITE_DONE) {

NSLog(@"更新数据成功");

}else {

NSLog(@"更新数据失败");

}

}else {

NSLog(@"result = %d",result);

}

//释放

sqlite3_finalize(stmt);

}

//通过uid去删除数据

- (void)deleteWithUID:(NSInteger)uid {

NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld",uid];

int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL);

if (result == SQLITE_OK) {

NSLog(@"删除成功");

}else {

NSLog(@"删除失败");

}

}

//查找所有数据

- (void)searchAll {

NSString *searchAllStr = @"select * from person ";

sqlite3_stmt *stmt = nil;

//预执行

int result = sqlite3_prepare(db, searchAllStr.UTF8String, -1, &stmt, NULL);

if (result == SQLITE_OK) {

//查询数据的时候当不知道有多少次的时候使用while循环

//sqlite3_step(stmt) == SQLITE_ROW代表逐行执行数据

while (sqlite3_step(stmt) == SQLITE_ROW) {

//第一个参数:伴随指针

//第二个参数:代表这个字段的位置坐标(只有带问号的是从1开始,其余所有的都从0开始)

int uid = sqlite3_column_int(stmt, 0);

NSLog(@"uid = %d",uid);

//在oc代码中要使用c语言的 相关内容,应该使用utf - 8

NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];

NSLog(@"name = %@",name);

NSString *gender = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];

NSLog(@"gender = %@",gender);

int age = sqlite3_column_int(stmt, 3);

NSLog(@"age = %d",age);

}

}else {

NSLog(@"result = %d",result);

}

//释放伴随指针

sqlite3_finalize(stmt);

}

//根据名字去查找相关的数据信息

- (void)searchWithName:(NSString *)name {

NSString *searchStr = @"select uid,gender,age from person where name =  ?";

sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL);

if (result == SQLITE_OK) {

//绑定

sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);

while (sqlite3_stmt_busy(stmt) == SQLITE_ROW) {

int uid = sqlite3_column_int(stmt, 0);

NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];

int age = sqlite3_column_int(stmt, 3);

NSLog(@"++++uid = %d,gender = %@,age = %d",uid,gender,age);

}

}else {

NSLog(@"result = %d",result);

}

sqlite3_finalize(stmt);

}

运行结果如图所示: 

2.结果

3.结果

 

时间: 2024-10-16 20:40:31

iOS-senior2-数据库的相关文章

iOS开发数据库篇—FMDB数据库队列(下)

iOS开发数据库篇—FMDB数据库队列(下) 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05-FMDB数据库队列 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "Y

iOS开发数据库篇—SQLite的应用

iOS开发数据库篇—SQLite的应用 一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二.具体说明 新建一个项目,在项目的主界面中放四个按钮(分别是,增加.删除.修改.查询). 1.sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)函数的一些说明: (1)作用:把一个文件名称传递给他,它会自动检测这个文件是

iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDa

iOS开发数据库篇—FMDB数据库队列

iOS开发数据库篇—FMDB数据库队列 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05-FMDB数据库队列 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYVi

iOS开发数据库篇—SQLite常用的函数

iOS开发数据库篇—SQLite常用的函数 一.简单说明 1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 2.执行任何SQL语句 int sqlite3_exec( sqlite3*,                                  // 一个打开的数据库实例 const char *sql,                    

iOS开发数据库-FMDB

前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操作方法,有效地防止数据混乱:FMDB同时兼容ARC和非ARC工程,在编译的时候会自动根据工程配置来调整相关的内存管理代码. 使用方法 FMDB有三个主要的类 FMDatabase 表示一个单独的SQLite数据库. 用来执行SQLite的命令. FMResultSet 表示FMDatabase执行查

IOS开发数据库篇—SQLite模糊查询

IOS开发数据库篇—SQLite模糊查询 一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: 1 // 2 // YYPerson.h 3 // 03-模糊查询 4 // 5 // Created by apple on 14-7-27. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h

【转】 iOS开发数据库篇—SQLite简单介绍

开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyedArchiver (2)偏好设置:NSUserDefaults (3)Plist存储:writeToFile 提示:上述三种方

iOS开发数据库篇—SQL代码应用示例

iOS开发数据库篇—SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在ios项目中使用代码批量添加多行数据示例 代码示例: 1 // 2 // main.m 3 // 01-为数据库添加多行数据 4 // 5 // Created by apple on 14-7-26. 6 // Copyright (c) 2014年 wendingding. All rights

iOS coredata 数据库升级 时报Can&#39;t find model for source store

在coredata 数据库结构被更改后,没根据要求立即建立新version,而是在原version上进行了小修改,之后才想起来建立新版本.并通过以下代码合并数据库, NSError *error = nil; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,