iOS--sqlite数据库(举例)

本文介绍了如何使用Objective-C和SQLite3实现学生信息的数据库操作,包括创建表、插入、更新、删除和查询数据。

写一个学生类 .h文件中定义四个属性
原代码:

@property(nonatomic ,copy)NSString *name;
@property(nonatomic ,copy)NSString *sex;
@property(nonatomic ,copy)NSString *hobby;
@property(nonatomic ,assign)NSInteger age;

创建一个数据库工具:继承于NSObject
在这之前要先找到一个框架 libsqlite3.0.dylib 加入到工程中
在这个工具类中引入头文件
(1).引入要存数据的类的头文件
(2).数据库的头文件

#import <sqlite3.h>
#import "Student.h"

在.h文件延展 用来保存数据库的地址

@interface dataBaseTool : NSObject
{
// 用来保存数据库对象的地址
sqlite3 *dbPoint;
}

为了保证当前数据在工程里是唯一的 ,我们用简单单例的方式创建一个数据库工具对象
(1).在.h文件中写一个方法

+ (dataBaseTool *)sharDataBaseTool;

(2).在.m文件中写实现方法

+ (dataBaseTool *)sharDataBaseTool{
  static dataBaseTool *tool;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    tool =[[dataBaseTool alloc] init];
  });
  return tool;
}

1.打开数据库
(1).在.h文件中创建方法

-(void)openDB;

(2).在.m文件中实现方法

-(void)openDB{
  // 数据库文件也保存在沙盒的documents文件里, 所以先找沙盒路径
  NSArray *sandBox =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
  NSString *sandBoxPath =sandBox[0];
  // 拼接文件路径 ,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果没有则会创建一个相应的数据库  
   NSString *documentPath =[sandBoxPath stringByAppendingPathComponent:@"Student.sqlite"];   
  int result =sqlite3_open([documentPath UTF8String], &dbPoint);
  if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
        NSLog(@"%@",documentPath);
  }else{
        NSLog(@"数据库打开失败");
  }

(3).在viewController中调用
引入student类和dateBaseTool数据库的头文件

#import "dataBaseTool.h"
 #import "Student.h"

调用:

[[dataBaseTool sharDataBaseTool] openDB];

2 .给数据库创建张表格 ,table
(1).在.h文件中定义方法:

-(void)createTable;

(2).在.m文件中实现方法

-(void)createTable{
 // primary key 是主键的意思 ,主键在当前表格前表里数据是唯一的,不能重复,可以是唯一的标示一条数据,一般是整数
   // zutoincrement自增 ,为了让主键不重复,会让主键采用自增的方式
   // if not exists 如果没有表才会创建,防止重复创建覆盖之前数据
   // 数据库问题%90是sql语句出问题,所以保证语句没问题,再放到工程里使用
   NSString *sqlStr =@"create table if not exists stu(number integer primary key autoincrement, name text, sex text, age integer, hobby text)";
   // 执行这条sql语句
   int result = sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
   if (result == SQLITE_OK) {
      NSLog(@"表创建成功");
   }else {
      NSLog(@"表创建失败");
   }
}

(3).调用

[[dataBaseTool sharDataBaseTool] createTable];

3.向表里插入一个学生信息
(1).h

-(void)insertStu:(Student *)stu;

(2).m

-(void)insertStu:(Student *)stu{
  // 语句里值的位置要加上单引号
  NSString *sqlStr =[NSString stringWithFormat:@"insert into stu (name, age, sex, hobby) values ('%@', %ld, '%@', '%@')", stu.name, stu.age, stu.sex ,stu.hobby];
// 执行sql语句
  int result =sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
  if (result == SQLITE_OK) {
    NSLog(@"添加学生成功");
  }else{
    NSLog(@"添加学生失败");
  }
}

(3).调用

创建一个stu  
Student *stu =[[Student alloc] init];
  stu.name =@"zhang";
  stu.age =20;
  stu.sex =@"nan";
  stu.hobby =@"ying";
  // 调用添加的方法
  [[dataBaseTool sharDataBaseTool] insertStu:stu];

4.更新表里的学生数据
(1).h

- (void)updateStu:(Student *)stu;

(2).m

- (void)updateStu:(Student *)stu{
  NSString *sqlStr = [NSString stringWithFormat:@"update stu set name = '%@', sex = '%@', hobby = '%@', age = %ld where name = '%@'",stu.name, stu.sex, stu.hobby ,stu.age,stu.name];
  // 执行sql语句
  int result =sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
  if (result == SQLITE_OK) {
    NSLog(@"更新成功");
  }else{
    NSLog(@"更新失败");
  }
}

(3).调用

创建一个stu <br /> Student *stu =[[Student alloc] init]; <br /> stu.name =@&quot;zhang&quot;; <br /> stu.sex =@&quot;nan&quot;; <br /> stu.hobby =@&quot;xuexi&quot;; <br /> stu.age =30; <br /> 调用 <br /> [[dataBaseTool sharDataBaseTool] updateStu:stu];

5.删除数据
(1).h

-(void)deleteStu:(Student *)stu;

(2).m

-(void)deleteStu:(Student *)stu{
  NSString *sqlStr =[NSString stringWithFormat:@"delete from stu where name = '%@'",stu.name];
  int result =sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);
  if (result == SQLITE_OK) {
    NSLog(@"删除成功");
  }else{
    NSLog(@"删除失败");
  }
}

(3).调用
删除 学生名字是zhang的学生信息

 Student *stu =[[Student alloc] init];
    stu.name =@"zhang";   
 [[dataBaseTool sharDataBaseTool] deleteStu:stu];
  1. 查询数据库中所有学生表里的数据
    (1).h
-(NSMutableArray *)selectAllStu;

(2).m

-(NSMutableArray *)selectAllStu{
 // 查询逻辑
   // 1.先从本地的数据库中读取某张表里的所有数据
   // 2.然后逐条进行读取,对model进行赋值
   // 3.把已经赋值好的model放到数组中,并且返回
   NSString *sqlStr =@"select * from stu";
   // 在语句里 * 是通配符的意思 ,通过一个 *相当于代替了表里的所有的字段名
   // 接下来需要定义一个跟随指针,他用来遍历数据库表里中的每行数据
   sqlite3_stmt *stmt =nil;
   // 第三个参数:查询语句字数限制 , -1是没有限制
   int result =sqlite3_prepare_v2(dbPoint, [sqlStr UTF8String], -1, &stmt, nil);
   // 这个方法相当于把数据库和跟随指针相关联,一同完成查询功能
   // 初始化一个用来装学生的数组
   NSMutableArray *stuArr =[NSMutableArray array];
   if (result == SQLITE_OK ){
      NSLog(@"查询成功");
      // 开始便利查询数据库的每一行
     while(sqlite3_step(stmt)== SQLITE_ROW){
 // 让跟随指针进行便利查询, 如果没有行,才会停止循环
// 满足条件,则逐列的读取这一行上的数据
// 第二个参数表示当前这列数据在表中的第几列
        const unsigned char *name =sqlite3_column_text(stmt, 1);
        const unsigned char *sex = sqlite3_column_text(stmt, 2);
        int age =sqlite3_column_int(stmt, 3);
        const unsigned char *hobby  =sqlite3_column_text(stmt, 4);
        // 把列里面的数据在进行类型的转换
        NSInteger stuAge = age;
        NSString *stuName =[NSString stringWithUTF8String:(const char*)name];
        NSString *stuSex =[NSString stringWithUTF8String:(const char*)sex];
        NSString *stuHobby =[NSString stringWithUTF8String:(const char*)hobby];
 // 给对象赋值 ,然后把对象放到数组里
        Student *stu =[[Student alloc] init];
        stu.name =stuName;
        stu.sex =stuSex;
        stu.hobby =stuHobby;
        stu.age =stuAge;
        [stuArr addObject:stu];
      }
   }else{
      NSLog(@"查询失败");
      NSLog(@"%d",result);
   }         
 return stuArr;
}

(3).调用

创建数组接收数据
NSMutableArray *arr =[[dataBaseTool sharDataBaseTool] selectAllStu];
遍历数组    
for (Student *stu in arr) {
        NSLog(@"%@",stu.name);
    }

7.关闭数据库
(1).h
-(void)closeDB;
(2).m

-(void)closeDB{
    int result =sqlite3_close(dbPoint);
    if (result == SQLITE_OK) {
        NSLog(@"数据关闭成功");
    }else{
 NSLog(@"数据关闭失败");
    }    
}

(3).调用

[[dataBaseTool sharDataBaseTool ] closeDB];
<think>我们被要求讲一下SQLite数据库,包括其基本概念、特点、使用场景以及一个简单的示例。 注意:回答结束后必须按照要求提出3-5个相关问题,以“§§相关问题§§”开头,并且问题编号连续。 SQLite 是一个轻量级的嵌入式关系型数据库管理系统,它不需要单独的服务器进程,允许直接读取和写入普通磁盘文件。它是一个零配置的数据库,这意味着不需要安装或管理。SQLite 实现了大多数 SQL 标准,包括事务(原子性、一致性、隔离性和持久性)、触发器和视图。 主要特点: 1. 无服务器:SQLite 不需要运行一个服务器,数据库就是一个文件。 2. 零配置:不需要复杂的安装配置过程。 3. 跨平台:支持多种操作系统,如 Windows, Linux, macOS, Android, iOS 等。 4. 轻量级:整个数据库系统只有几百KB,但可以处理高达数TB的数据。 5. 事务支持:支持ACID(原子性、一致性、隔离性、持久性)事务。 6. 支持大多数SQL92标准:包括子查询、视图、触发器等。 使用场景: - 移动应用:由于轻量级,非常适合嵌入到移动应用中(如Android和iOS)。 - 桌面应用:作为本地存储解决方案。 - 小型Web应用:对于低流量网站,SQLite可以作为后端数据库- 嵌入式系统:资源受限的环境。 - 测试:作为临时数据库进行单元测试或集成测试。 一个简单的使用示例(用Python): 以下是一个使用Python内置的sqlite3模块创建数据库、创建表、插入数据并查询的示例。 ```python import sqlite3 # 连接到数据库(如果不存在则创建) conn = sqlite3.connect('example.db') cursor = conn.cursor() # 创建表 cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') # 插入数据 cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 25)) cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 30)) # 提交事务 conn.commit() # 查询数据 cursor.execute("SELECT * FROM users") rows = cursor.fetchall() for row in rows: print(row) # 关闭连接 conn.close() ``` 输出结果可能为: (1, 'Alice', 25) (2, 'Bob', 30) 注意事项: - SQLite 不支持一些高级特性,如存储过程、外键约束(需要手动开启)等。 - 在高并发写入场景下性能可能不如客户端/服务器数据库(如MySQL、PostgreSQL),因为整个数据库文件在同一时间只能被一个写操作锁定。 §§相关问题§§ 1. SQLite数据库文件的结构是怎样的?如何备份和恢复SQLite数据库? 2. 在SQLite中如何实现多表连接查询?请举例说明。 3. SQLite支持哪些数据类型?与其它关系型数据库(如MySQL)有什么不同? 4. 在并发访问的情况下,SQLite如何处理读写冲突? 5. SQLite有哪些安全机制来防止SQL注入攻击? </think> ### SQLite 数据库介绍 SQLite 是一个轻量级、嵌入式的关系型数据库管理系统,具有以下核心特性: 1. **无服务器架构** - 数据库以单一文件形式存储(通常以 `.db` 或 `.sqlite` 为后缀) - 无需独立服务器进程,直接通过库函数访问文件 - 示例:`test.db` 文件包含完整的数据库结构和数据 2. **零配置** - 无需安装或管理复杂的数据库服务 - 开箱即用,适合嵌入式设备和移动应用 3. **跨平台支持** - 支持 Windows/Linux/macOS/Android/iOS 等系统 - 提供 C/C++/Python/Java 等语言的 API 接口 4. **支持标准 SQL** - 兼容 SQL-92 标准的大部分语法 - 支持事务、触发器、视图、索引等特性 5. **高性能与小型化** - 整个库仅需 500KB 左右内存 - 处理速度可达每秒数万次简单查询 #### 使用场景 - 移动应用(Android/iOS 本地存储) - 嵌入式设备(IoT 设备数据存储) - 桌面软件配置存储 - 中小型网站的数据库 - 开发测试环境 #### Python 操作示例 ```python import sqlite3 # 连接数据库(不存在则创建) conn = sqlite3.connect('mydb.db') cursor = conn.cursor() # 创建表 cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE ) ''') # 插入数据 cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('张三', 'zhangsan@example.com')) conn.commit() # 查询数据 cursor.execute("SELECT * FROM users") print(cursor.fetchall()) # 输出:[(1, '张三', 'zhangsan@example.com')] # 关闭连接 conn.close() ``` #### 优势与局限 **优势**: - 部署简单,无需数据库服务器 - 事务支持 ACID 特性 - 支持内存数据库(`:memory:` 模式) **局限**: - 并发写入性能受限(文件锁机制) - 无内置用户权限管理系统 - 不适合超大规模数据存储(TB 级)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值