IOS学的容易---数据库详细的操作(继承与单例类封装一,二)

本文介绍了一个Objective-C项目中如何使用SQLite进行数据库操作,包括创建数据库、插入、更新、删除及查询学生信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库 (代码)

//
// ViewController.m
// LessonUI_20_Sqlite(
数据库)
//
// Created by lanou3g on 15/9/10.
// Copyright (c) 2015
Lanou. All rights reserved.//

#import "ViewController.h"#import "DataBaseHanddle.h"#import "Student.h"

@interface ViewController ()@end
@implementation
ViewController- (void)viewDidLoad {

[super viewDidLoad];
// [[DataBaseHanddle shardInshtance]creatDB];

// 创建学⽣生对象

Student *stu1 =[[Student alloc]initWithName:@"张三"number:@"10001" age:23];

Student *stu2 = [[Student alloc]initWithName:@"⺩王五"number:@"10002" age:24];

Student *stu3 = [[Student alloc]initWithName:@"⻢马六"number:@"10003" age:26];

// 添加⼀一个学⽣生
[[DataBaseHanddle shardInshtance]insertStudent:stu1];[[DataBaseHanddle shardInshtance]insertStudent:stu2];[[DataBaseHanddle shardInshtance]insertStudent:stu3];

// 修改⼀一个学⽣生
[[DataBaseHanddle shardInshtance]updateNameOfStudent:@"李四"

byNumber:@"10001"];// 删除⼀一个学⽣生

    [[DataBaseHanddle
shardInshtance]deleteStudentByNumber:@"10001"];

// 查询所有学⽣生
NSArray *array = [[DataBaseHanddle

shardInshtance]selectAllStudents];
   NSLog(@"%@",array);
   // Do any additional setup after loading the view, typically

from a nib.

}

- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];

   // Dispose of any resources that can be recreated.

}

@end

//
// DataBaseHanddle.h
// LessonUI_20_Sqlite(
数据库)
//
// Created by lanou3g on 15/9/10.
// Copyright (c) 2015
Lanou. All rights reserved.//

#import <Foundation/Foundation.h>#import "Student.h"

@interface DataBaseHanddle : NSObject#pragma mark ------ 获取单例对新昂

+(instancetype)shardInshtance;#pragma mark ---创建(链接)数据库

-(void)creatDB;
#pragma mark ---向数据库表中添加(插⼊入)⼀一个学⽣生信息

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

#pragma mark ----更新(修改)数据库表中某个学⽣生的信息(如:根据学号,修改学⽣生的姓名)
-(void)updateNameOfStudent:(NSString *)name byNumber:(NSString*)number;

#pragma mark ---根据学号删除⼀一个学⽣生的所有信息-(void)deleteStudentByNumber:(NSString *)number;

#pragma mark ----查询数据库中所有学⽣生的信息-(NSArray *)selectAllStudents;

@end

//
// DataBaseHanddle.m
// LessonUI_20_Sqlite(
数据库)
//
// Created by lanou3g on 15/9/10.

// Copyright (c) 2015Lanou. All rights reserved.//

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

@interface DataBaseHanddle ()

{

sqlite3 *_db;}

@end
@implementation
DataBaseHanddlestatic DataBaseHanddle *handle = nil;

#pragma mark ------ 获取单例对象+(instancetype)shardInshtance

{
   @synchronized(self){

if (handle == nil) {

handle = [[DataBaseHanddle alloc]init];}

}
return handle;

}

#pragma mark ---创建(链接)数据库-(void)creatDB

{

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).lastObject;

NSString *dbPath = [documentPathstringByAppendingPathComponent:@"student.db"];

   NSLog(@"%@",dbPath);

//这个函数打开了⼀一个sqlite数据库⽂文件的链接并且返回了⼀一个数据库链接对象int result = sqlite3_open(dbPath.UTF8String, &_db);

if ( result == SQLITE_OK) {NSLog(@"创建链接数据库成功");
// 如果数据库创建成功,就可以创建表了

[self creatTable];

}else {
NSLog(@"创建(链接)数据库失败! %d",result);

// 表⽰示的是数据库链接对象,对数据库中表的操作都是基于这个链接的

// 指定存放在沙盒中的数据库路径NSString *documentPath =

}}

#pragma mark ---创建数据库中的表(table)-(void)creatTable

{

INTEGER, stu BLOB, number TEXT PRIMARY KEY);";// 2、执⾏行语句

char *errmsg = NULL;

int result = sqlite3_exec(_db, creatSql.UTF8String, NULL, NULL,&errmsg);

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

}else {

NSLog(@"创建表失败 ! %s",errmsg);}

}

#pragma mark ---关闭数据库(链接)-(void)closeDB

{
int result = sqlite3_close(_db);if (result == SQLITE_OK) {

NSLog(@"关闭链接成功");

_db = NULL;}else {

NSLog(@"关闭失败 !%d",result);}

}

#pragma mark ---向数据库表中添加(插⼊入)⼀一个学⽣生信息-(void)insertStudent:(Student *)stu

{
[
selfcreatDB]; //打开数据库链接

// 1、准备SQL语句
// 形式:insert into 表名(字段1,字段2...) values(?,?,?,?)

NSString *insertSQL = @"insert intostudents(name,age,stu,number) values(?,?,?,?)";

// 跟随指针 ,能够 ⽤用sqlite3_step() 这个函数来执⾏行 编译完成的 你所准备的SQL语句 的指针。 在sqlite⾥里并没有定义sqlite_stmt这样类型的指针,它是⼀一个抽象类型(结构体指针)

sqlite3_stmt *stmt = nil;
// 2、检查SQL语句的语法是否正确

// 1、准备创建表的SQL语句
//形式:creat table 表名(字段1 类型,字段2 类型)
NSString *creatSql = @"CREATE TABLE students (name TEXT, age

int result = sqlite3_prepare_v2(_db, insertSQL.UTF8String, -1,&stmt, NULL);

NSLog(@"%d",result);
if (result == SQLITE_OK) {

// 给字段绑定值
#warning mark ----第⼆二参数是从1开始的,对应的是第⼏几个 '?'

sqlite3_bind_text(stmt, 1, [stu.name UTF8String], -1, NULL);sqlite3_bind_int(stmt, 2, stu.age);sqlite3_bind_text(stmt, 4, [stu.number UTF8String], -1,

NULL);
#pragma mark ---将复杂对象转换为NSData,才能存⼊入数据库中

// 归档
NSMutableData *data = [NSMutableData data];NSKeyedArchiver *archiver = [[NSKeyedArchiver

alloc]initForWritingWithMutableData:data];[archiver encodeObject:stu forKey:[NSString

stringWithFormat:@"student%@",stu.number]];[archiver finishEncoding];

sqlite3_bind_blob(stmt, 3, [data bytes], (int)[data length],

NULL);
// 执⾏行准备好且编译好的SQL语句

// 这个⽅方法⽤用于执⾏行 sqlite_praPare_v2() 检查通过的SQL语句,这个语句执⾏行到结果的第⼀一⾏行可⽤用的位置(如果你进⾏行的数据库操作是:insert,updata,delete),只需要执⾏行⼀一次这个⽅方法就可以

       sqlite3_step(stmt);
    }

// 销毁你前⾯面sqlite3_prepare_v2() 所检查通过的SQL语句 (结束跟随指针)sqlite3_finalize(stmt);

// 关闭数据库链接[self closeDB];

}

#pragma mark ----更新(修改)数据库表中某个学⽣生的信息(如:根据学号,修改学⽣生的姓名)
-(void)updateNameOfStudent:(NSString *)name byNumber:(NSString*)number

{
[
self creatDB];

// 1、准备SQL语句(更新)
//
形式:update 表名 set 字段 = '' where 字段 = ''
NSString *upDataSql = @"update students set name = ? where

number = ?";
// 2、检查SQL语句是否合法
// 跟随指针
sqlite3_stmt *stmt = NULL;

int result = sqlite3_prepare_v2(_db, upDataSql.UTF8String, -1,&stmt, NULL);

NSLog(@"%d",result);
if (result == SQLITE_OK) {

// 绑定字段
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);sqlite3_bind_text(stmt, 2, [number UTF8String], -1, NULL);

// 执⾏行

       sqlite3_step(stmt);
    }

// 结束跟随指针sqlite3_finalize(stmt);

[self closeDB];}

#pragma mark ---根据学号删除⼀一个学⽣生的所有信息-(void)deleteStudentByNumber:(NSString *)number

{
[
self creatDB];

// 准备SQL语句(删除)
//
形式:deletefrom表名where 字段=
NSString *deleteSql = @"delete from students where number = ?";

// 检查SQL语句是否合法
// 跟随指针
sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_db, deleteSql.UTF8String, -1,&stmt, NULL);

if (result == SQLITE_OK) {// 绑定字段

sqlite3_bind_text(stmt, 1, [number UTF8String], -1, NULL);// 执⾏行
sqlite3_step(stmt);

}

// 结束跟随指针sqlite3_finalize(stmt);

[self closeDB];}

#pragma mark ----查询数据库中所有学⽣生的信息-(NSArray *)selectAllStudents

{
[
self creatDB];

// 准备SQL语句(查询)
//
形式:select * from 表名

NSString *sql = @"select * from students";// 2、检查SQL语句
sqlite3_stmt *stmt = nil;

int result = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt,NULL);

NSMutableArray *studentsArray = [NSMutableArray array];if (result == SQLITE_OK) {

while (sqlite3_step(stmt) == SQLITE_ROW) { //表⽰示查找到了⼀一条 正确数据

// 取字段下的值
#warning mark ----sqlite_column_xxx⽅方法中的第⼆二个参数与数据库表中的字段的顺序是⼀一致的。(下标从0开始)

NSString *name = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 0)];

int age = sqlite3_column_int(stmt, 1);

NSString *number = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 3)];

NSData *data = [NSDatadataWithBytes:sqlite3_column_blob(stmt, 2)length:sqlite3_column_bytes(stmt, 2)];

// 反归档

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];

Student *stu = [unarchiver decodeObjectForKey:[NSStringstringWithFormat:@"student%@",number]];

[unarchiver finishDecoding];
NSLog(@"%@ %@ %@ %d",number,name,stu,age);

// 将 反归档得到的Student 对象存⼊入数组[studentsArray addObject:stu];

}

    }
   sqlite3_finalize(stmt);

[self closeDB];return studentsArray;

}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值