SQL数据库的简单使用

一、 SQL数据库的建立,查询和删除等常用操作可以参考这个网址   http://www.w3school.com.cn/sql/



二、数据库的打开和关闭(iOS下要导入libsqlite3.dylib框架)

一般情况下会将其封装为一个单一的类,便于外界使用。

其 .h 中声明两个类方法,代码为

#import <Foundation/Foundation.h>
#import <sqlite3.h>
@interface DataBase : NSObject
// 打开数据库
+ (sqlite3 *)openDB;
// 关闭数据库
+ (void)closeDB;
@end

在 .m 中实现两个方法

#import "DataBase.h"
static sqlite3 *db;
@implementation DataBase
+ (sqlite3 *)openDB{
  // 如果已经打开就直接返回数据库
    if (db) {
        return db;
    }
  // 获取document的路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(9, 1, 1) lastObject];
    // 拼接字符串
    NSString *path = [documentPath stringByAppendingPathComponent:@"Students.sqlite"];
    // 文件管理类对象(单例)
    NSFileManager *fileManger = [NSFileManager defaultManager];
    // 判断数据库是否在document中,不在的话将数据库文件拷贝至document,因为在应用包中的数据库文件是无法读取的,只有放在沙盒下才可以读取
    if ([fileManger fileExistsAtPath:path] == NO) {
        NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"sqlite"];
        [fileManger copyItemAtPath:filePath toPath:path error:nil];
    }
    sqlite3_open([path UTF8String], &db);
    return db;

}
// 关闭数据库
+ (void)closeDB{
    sqlite3_close(db);
}
@end


三、 一些具体的操作(取出所有数据, 删除, 更新,查找等), 最好定义一个单例类,方便外界使用(因为其使用较为频繁)

1,需要定义一个类,比如Student,其内部代码

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property(nonatomic, assign)int number;
@property(nonatomic, copy)NSString *name;
@property(nonatomic, copy)NSString *sex;
- (instancetype)initWithNumber:(int)number name:(NSString *)name sex:(NSString *)sex;
@end
#import "Student.h"

@implementation Student
- (instancetype)initWithNumber:(int)number name:(NSString *)name sex:(NSString *)sex{
    self = [super init];
    if (self) {
        self.number = number;
        self.name = name;
        self.sex = sex;
    }
    return self;
}
@end

2,定义一个单例类,比如StudentHandle

现在.h 中声明几个方法

#import <Foundation/Foundation.h>
#import "Student.h"
@interface StudentHandle : NSObject
// 单例方法
+ (StudentHandle *)standardHandle;
// 取出所有对象
- (NSArray *)allStudents;
// 根据number取出某个对象
- (Student *)studentByNumber:(int)number;
// 插入数据
- (BOOL)insertStudentWithName:(NSString *)name sex:(NSString *)sex;
// 删除数据
- (BOOL)deleteStudentByNumber:(int)number;
// 更新数据
- (BOOL)updateStudentWithName:(NSString *)name byNumber:(int)number;
@end
#import "StudentHandle.h"
#import "DataBase.h"
@implementation StudentHandle
// 创建单例
static StudentHandle *studentHandle = nil;
+ (StudentHandle *)standardHandle{
    @synchronized(self){
    if (studentHandle == nil) {
        studentHandle = [[StudentHandle alloc] init];
    }
    return studentHandle;
    }
}

- (NSArray *)allStudents{
    // 1,打开数据库
    sqlite3 *db = [DataBase openDB];
       // 2,准备SQL语句
    sqlite3_stmt *stmt = nil;
  int result = sqlite3_prepare(db, "select * from StudentInfo", -1, &stmt, nil);
    NSMutableArray *arr = nil;
    if (result == SQLITE_OK) {
        // 3,执行stmt
        arr = [NSMutableArray arrayWithCapacity:0];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 4,获取数据
            int number = sqlite3_column_int(stmt, 0);
            const unsigned char *nameUTF = sqlite3_column_text(stmt, 1);
            const unsigned char *sexUTF = sqlite3_column_text(stmt, 2);
            Student *stu = [[Student alloc] initWithNumber:number name:[NSString stringWithUTF8String:(const char *)nameUTF] sex:[NSString stringWithUTF8String:(const char *)sexUTF]];
            [arr addObject:stu];
        }

    }
    // 释放stmt所占用的内存
    sqlite3_finalize(stmt);
    return arr;

}
- (Student *)studentByNumber:(int)number{
    sqlite3 *db = [DataBase openDB];
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, "select name,number, sex from StudentInfo where number = ?", -1, &stmt, nil);
    Student *stu = nil;
    if (result == SQLITE_OK) {
        sqlite3_bind_int(stmt, 1, number);
        if (sqlite3_step(stmt) == SQLITE_ROW) {
            const unsigned char *nameUTF = sqlite3_column_text(stmt, 0);
            int number = sqlite3_column_int(stmt, 1);
            const unsigned char *sexUTF = sqlite3_column_text(stmt, 2);
            stu = [[Student alloc] initWithNumber:number name:[NSString stringWithUTF8String:(const char *)nameUTF] sex:[NSString stringWithUTF8String:(const char *)sexUTF]];
        }

    }
    sqlite3_finalize(stmt);
    return stu;
}

- (BOOL)insertStudentWithName:(NSString *)name sex:(NSString *)sex{
    sqlite3 *db = [DataBase openDB];
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, "insert into StudentInfo (name, sex) values (?, ?)", -1, &stmt, nil);
    BOOL insertInfo = NO;
    if (result == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
        sqlite3_bind_text(stmt, 2, [sex UTF8String], -1, nil);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            insertInfo = YES;
        }
    }
    sqlite3_finalize(stmt);
    return insertInfo;
}

- (BOOL)deleteStudentByNumber:(int)number{
    sqlite3 *db = [DataBase openDB];
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, "delete from StudentInfo where number = ?", -1, &stmt, nil);
    BOOL deleteInfo = NO;

    if (result == SQLITE_OK) {
        sqlite3_bind_int(stmt, 1, number);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            deleteInfo = YES;
        }
    }
    sqlite3_finalize(stmt);
    return deleteInfo;
}
- (BOOL)updateStudentWithName:(NSString *)name byNumber:(int)number{
    sqlite3 *db = [DataBase openDB];
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, "update StudentInfo set name = ? where number = ?", -1, &stmt, nil);
    BOOL updateInfo = NO;
    if (result == SQLITE_OK) {

        sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
        sqlite3_bind_int(stmt, 2, number);

        if (sqlite3_step(stmt) == SQLITE_DONE) {
            return updateInfo = YES;
        }

    }
    sqlite3_finalize(stmt);
    return updateInfo;
}
@end
时间: 2024-10-13 17:07:23

SQL数据库的简单使用的相关文章

SQL数据库&mdash;&lt;&hellip;&gt;事务--简单学习

事务 一.什么是事务能够保证数据的一致性的代码控制,要么执行提交,要么滚回事务的初始状态 二.事务的四大特性:ACIDA:原子性-------事务不可拆开,要么执行要么回滚无中间状态C:一致性-------数据前后一致性I:隔离性-------事务在执行的过程中是不予许外界干扰的D:持有性-------存在硬盘上的 开始事务:begin transaction 或者 begin tran  或者 start transaction [事务名]提交事务:commit[事务名]回滚事务:rollba

SQL数据库&mdash;&lt;&hellip;&gt;视图&hellip;简单学习

掌握:1.视图是个什么东西?2.会建视图,会查视图3.知道视图的主要功能是查询,不是增删除改. 视图的定义: 视图可以认为是从一个数据表或者多个数据表中导出的表,视图本身没有任何数据,它是用来存放视图的定义,因此视图只是虚拟表:如果数据表中的数据记录发生变化,那么跟该表有关的视图也会发生相应的变化. 视图--相对应的是表查询结果.表--真正存储数据的地方.视图--不存数据,展示查询的结果. 视图的作用: 1.提高数据访问的安全性    2.方便查询操作    创建视图:create view 视

初识Winform 与C#----一个简单涉及SQL数据库的通讯录 (Contact3)

一.  关于Winform 启动程序和显示窗体--------------------------------[Program.cs]------------------用来启动程序,显示最基础的窗体 Winfom(窗体)中的许多控件------------------------[form1.cs]---------------------用来定义控件窗体,及其中的对象, ------[form1.Designer.cs]----------定义窗体及其中的对象的行为,即函数,或者方法. 控件

SQL数据库知识二(Day 25)

又到了总结知识的时候了,今天主要把SQL数据库给简单的学完了,明天开始就要开始学ADO.NET的知识了.好了,话不多说,还是看一下今天都学了哪些内容. 1  字符串类型的知识点 --类型的使用 --截取字符串 select 姓名,substring(姓名,1,1) as 姓氏,substring(姓名,2,2)as 名字 from 职工 --substring(express,start,length) --express:字符串 start:整数 制定字符串分割的开始位置 length: 分割

使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的MySQL Community Server 选择想要的版本进行下载 之后的步骤,因为本人已经安装过MySQL数据库,而卸载重装会比较麻烦,卸载不干净会导致新的装不上,所以可以参考下面的博客,因为官网的改动,前面的部分已经与该博客不符,按照本人在上面的介绍寻找即可 https://blog.csdn

一个最简单的使用Entity Framework 查询SQL 数据库的例子

1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Entity Framework 和ADO.NET 3.5 Entity Framework Tools:右键单击创建的winform或者wpf程序,选择"Add|New Item",查看Templates 列表框中是否有ADO.NET Entity Data Model,如果没有,请到此网址下

SQL数据库查询方法

SQL数据库查询方法 简单查询: 一.投影 select * from 表名 select 列1,列2... from 表名 select distinct 列名 from 表名 二.筛选 select top 数字 列|* from 表名 (一)等值与不等值 select * from 表名 where 列名=值 select * from 表名 where 列名!=值 select * from 表名 where 列名>值 select * from 表名 where 列名<值 selec

FMDB数据库的简单实用

引入和FMDB第三方类库,  demo地址:http://pan.baidu.com/s/1c0pbfxA 1 #define dataBasePath [[(NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)) lastObject]stringByAppendingPathComponent:dataBaseName] 2 #define dataBaseName @"MyDatabase

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,