热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS疯狂详解之SQlite数据库增删改查

SqLiteManager.hMySqliteCreatedbylongon15915.Copyright(c)2015年WLong.All
//
// SqLiteManager.h
// MySqlite
//
// Created by long on 15/9/15.
// Copyright (c) 2015年 WLong. All rights reserved.
//

#import
#import "LanOuStudent.h"
#import
@interface SqLiteManager : NSObject


+ (SqLiteManager *)shareManager;


// 打开数据库
- (sqlite3 *)openDB;

// 关闭数据库
- (void)closeDB;

// 创建表
- (void)createTable;

// 插入数据
- (void)insertWithStudent:(LanOuStudent *)student;

// 删除数据
- (void)deleteWithAge:(NSInteger)age;

// 更改数据 根据名字 更改学号
- (void)updateName:(NSString *)name byAge:(NSInteger)age;

// 查询学生 根据名字和学号
- (LanOuStudent *)queryStudentWithName:(NSString *)name age:(NSInteger)age;

// 查询全部学生
- (NSArray *)queryAllStudent;


@end

//
// SqLiteManager.m
// MySqlite
//
// Created by long on 15/9/15.
// Copyright (c) 2015年 WLong. All rights reserved.
//

#import "SqLiteManager.h"

@implementation SqLiteManager

+ (SqLiteManager *)shareManager
{
static SqLiteManager *manager = nil;
if (manager == nil) {
manager = [[SqLiteManager alloc] init];
}
return manager;
}


// 定义一个静态区指针 连接数据库 让数据库再程序结束后自动释放
static sqlite3 *db = nil;

- (sqlite3 *)openDB
{
// 说明已经打开数据库
if (db != nil) {
return db;
}

// 创建数据库
// 先搞路径
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"Student.sqlite"];

NSLog(@"%@",dbPath);

// 如果没有Student.sqlite文件 会创建一个
int result = sqlite3_open(dbPath.UTF8String, &db);

if (result == SQLITE_OK) {
NSLog(@"打开数据库成功");
} else {
NSLog(@"打开数据库失败");
}

return db;
}


- (void)closeDB
{
int result = sqlite3_close(db);
if (result == SQLITE_OK) {

// 把指针 重置为空 方便下次打开
db = nil;

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

} else {
NSLog(@"关闭数据库失败");
}
}

// 创建表
- (void)createTable
{
// 1.打开数据库
db = [self openDB];

// 2.写sql语句 根据model 创建表
// create table Student (Student 是表名)
// number integer primary key not NULL 主键值 如果不操作 自增
NSString *sql = @"create table IF NOT EXISTS lanOuStudent(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL)";

// 3.执行sql语句 创建表

/**
* 第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。
第2个参数constchar*sql是一条sql 语句,以\0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写
法,以及这个参数的使用。
第5个参数char** errmsg 是错误信息。
*
*/

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

if (result == SQLITE_OK) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}

// 4.关闭数据库
[self closeDB];


}

// 插入数据
- (void)insertWithStudent:(LanOuStudent *)student
{
// 1.打开数据库
db = [self openDB];
// 2.写sql语句
NSString *sql = [NSString stringWithFormat:@"insert into lanOuStudent(name ,gender ,age , number) values('%@' ,'%@' , '%ld' , '%ld')",student.name,student.gender,student.age,student.number];
// 3.执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
// 4.关闭数据库
[self closeDB];
}

// 删除数据
- (void)deleteWithAge:(NSInteger)age
{
// 1.打开数据库
db = [self openDB];
// 2.写sql语句
NSString *sql = [NSString stringWithFormat:@"delete from lanOuStudent where age > '%ld'",age];
// 3.执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}

// 4.关闭数据库
[self closeDB];

}


// 更改数据 根据名字 更改学号
- (void)updateName:(NSString *)name byAge:(NSInteger)age
{
// 1.打开数据库
db = [self openDB];
// 2.写sql语句 where 后面是根据什么
NSString *sql = [NSString stringWithFormat:@"update lanOuStudent set age = '%ld' where name = '%@'",age,name];
// 3.执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);

if (result == SQLITE_OK) {
NSLog(@"更改成功");
} else {
NSLog(@"更改失败");
}

// 4.关闭数据库
[self closeDB];

}

// 查询学生 根据名字和学号
- (LanOuStudent *)queryStudentWithName:(NSString *)name age:(NSInteger)age
{
// 1.打开数据库
db = [self openDB];

// 2.写sql语句 *表示 查询所有字段
NSString *sql = [NSString stringWithFormat:@"select * from lanOuStudent where name = '%@' and age = '%ld'",name,age];

// 3.创建跟随指针 保存sql语句
sqlite3_stmt *stmt = nil;

// 4.执行语句
// -1 指sql语句长度 可以无限长
// &stmt 跟随指针 地址
// 第四个参数 截取sql语句未使用部分


int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);

// 5.判断语句是否正确
if (result == SQLITE_OK) {
NSLog(@"查询语句正确");

// 6.进行查询值的绑定 也就是问号? 的绑定
// 第二个参数 指第几个问号 从1开始
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 2, (int)age); // 注意转换类型

// 7.进行查询
// 如果 查询结果 返回 SQLITE_ROW 那么查询正确 执行循环
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 8.满足条件 读取数据
// 第二个参数 指的是 表中的列数 从0开始
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number = sqlite3_column_int(stmt, 0);

// 9.赋值学生对象 字符串需要转换格式
LanOuStudent *student = [[LanOuStudent alloc] init];
student.name = [NSString stringWithUTF8String:name];
student.gender = [NSString stringWithUTF8String:gender];
student.age = age;
student.number = number;

// 10.释放跟随指针
sqlite3_finalize(stmt);

return student;

}



} else {
NSLog(@"查询语句错误");
}

// 查询语句错误 也要释放跟随指针
sqlite3_finalize(stmt);

// 11.关闭数据库
[self closeDB];

return nil;
}


// 查询全部学生
- (NSArray *)queryAllStudent
{
// 1.打开数据库
db = [self openDB];
// 2.写sql语句
NSString *sql = @"select * from lanOuStudent";
// 3.创建跟随指针
sqlite3_stmt *stmt = nil;
// 4.执行语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
// 5.判断语句是否正确
if (result == SQLITE_OK) {
NSLog(@"查询语句正确");
// 6.创建数组
NSMutableArray *array = [NSMutableArray array];
// 7.执行查询
while (sqlite3_step(stmt) == SQLITE_ROW) {

// 8.满足条件 读取数据
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number = sqlite3_column_int(stmt, 0);

// 9.赋值学生对象 字符串需要转换格式
LanOuStudent *student = [[LanOuStudent alloc] init];
student.name = [NSString stringWithUTF8String:name];
student.gender = [NSString stringWithUTF8String:gender];
student.age = age;
student.number = number;

// 10.装进数组
[array addObject:student];

// 11.释放学生对象
[student release];
}

// 12.释放跟随指针
sqlite3_finalize(stmt);

return array;


} else {
NSLog(@"查询语句错误");
}

// 查询语句错误 也要释放跟随指针
sqlite3_finalize(stmt);

// 11.关闭数据库
[self closeDB];

return nil;
}


@end


//
// LanOuStudent.h
// MySqlite
//
// Created by long on 15/9/15.
// Copyright (c) 2015年 WLong. All rights reserved.
//

#import

@interface LanOuStudent : NSObject
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *gender;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,assign) NSInteger number;
@end




                        
                        
                         
推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
author-avatar
甩小三弃小四
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有