今天总结下数据库的基本使用方法:

iOS使用的数据库一般就是sqlite3,在使用该数据库前一定要先导入数据库框架,否则会出错,接下来引入头文件#import<sqlite3.h>

在工程里创建一个Model类Student,一个数据库工具类DataBaseTool

在Student.h中定义几条属性:

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *hobby;

@property(nonatomic,assign)NSInteger age;

@end

   DataBaseTool.h中对数据库操作方法的声明:

#import <Foundation/Foundation.h>

#import <sqlite3.h>

#import "Student.h"

@interface DataBaseTool : NSObject

{

//用来保存数据库对象的地址

sqlite3 *dbPoint;

}

//为了保证当前数据库在工程里是唯一的,我们用单例的方式创建一个数据库工具对象

+ (dataBaseTool *)shareDataBaseTool;

//打开数据库

- (void)openDB;

//给数据库创建张表格,table

- (void)createTable;

//插入一个学生信息

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

//更新一个学生信息

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

//删除操作

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

//查询操作

- (NSMutableArray *)selectAllStu;

//关闭数据库

- (void)closeDB;

@end

DataBaseTool.m中实现方法:

#import "dataBaseTool.h"

@implementation dataBaseTool

+ (dataBaseTool *)shareDataBaseTool{

static dataBaseTool *tool;

static dispatch_once_t oneToken;

dispatch_once(&oneToken, ^{

tool=[[dataBaseTool alloc] init];

});

return tool;

}

- (void)openDB{

//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径

NSArray *sandBox=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, 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(@"数据库打开失败");

}

}

- (void)createTable{

//primary key 是主键的意思,主健在当前表里数据是唯一的,不能重复,可以唯一标识一条数据,一般是整数

//autoincrement自增,为了让主键不重复,会让主键采用自增的方式

//if not exists 如果没有表才会创建,防止重复创建覆盖之前数据

//数据库问题90%是sql语句问题,所以先保证语句没问题,再放到工程里使用

NSString *sqlStr=@" create table if not exists stu(number integer primary key autoincrement,name text,age integer,hobby text)";

//执行这条sql语句

int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

if (result==SQLITE_OK) {

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

}else{

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

}

}

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

NSString *sqlStr=[NSString stringWithFormat:@"insert into stu (name,age,hobby) values ('%@','%ld','%@')",stu.name,stu.age,stu.hobby

];

//执行sql语句

int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

if (result==SQLITE_OK) {

NSLog(@"添加学生成功");

}else {

NSLog(@"添加学生失败");

}

}

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

NSString *sqlStr= [NSString stringWithFormat:@"update stu set hobby='%@',age=%ld where name='%@'",stu.hobby,stu.age,stu.name];

//执行sql语句

int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

if (result==SQLITE_OK) {

NSLog(@"更新成功");

}else{

NSLog(@"更新失败");

NSLog(@"%d",result);

}

}

- (void)deletedateStu:(Student *)stu{

NSString *sqlStr=[NSString stringWithFormat:@"delete from stu where name='%@'",stu.name];

//执行sql语句

int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

if (result==SQLITE_OK) {

NSLog(@"删除成功");

}else{

NSLog(@"删除失败");

}

}

- (NSMutableArray *)selectAllStu{

//查询逻辑

//1.先从本地的数据库中读取某张表里的所有数据

//2.然后逐条进行读取,对model进行赋值

//3.把已经赋值好得model放到数组中,并且返回

NSString *sqlStr=@"select * from stu";

//在语句里*是通配符的意思,通过一个*相当于代替了表里的所有的字段名

//接下来需要定义一个跟随指针,它用来遍历数据库表中的每行数据

//第三个参数:查询语句字数限制,-1是没有限制

sqlite3_stmt *stmt=nil;

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);

int age=sqlite3_column_int(stmt, 2);

const unsigned char *hobby=sqlite3_column_text(stmt,3);

//把列里的数据再进行类型的转换

NSInteger stuAge=age;

NSString *stuName=[NSString stringWithUTF8String:(const char *)name];

NSString *stuHobby=[NSString stringWithUTF8String:(const char *)hobby];

//给对象赋值,然后把对象放到数组里

Student *stu=[[Student alloc] init];

stu.name=stuName;

stu.hobby=stuHobby;

stu.age=stuAge;

[stuArr addObject:stu];

[stu release];

}

}else{

NSLog(@"查询失败");

NSLog(@"%d",result);

}

return stuArr;

}

- (void)closeDB{

int result=sqlite3_close(dbPoint);

if (result==SQLITE_OK) {

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

// NSLog(@"%@",documentPath);

}else{

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

}

}

@end

iOS数据库的基本使用的更多相关文章

  1. iOS 数据库操作(使用FMDB)

    iOS 数据库操作(使用FMDB)   iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

  2. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

  3. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...

  4. IOS数据库FMDB增、删、改、查的使用【原创】

    http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...

  5. iOS数据库操作之coredata详细操作步骤

    CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...

  6. 分享一段ios数据库代码,包括对表的创建、升级、增删查改

    分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...

  7. ios数据库

    1. ios数据库管理软件 ios使用的数据库是sqlite 管理软件有2种, 我只记得一种, 名字叫做 MesaSQLite 2. sqlite数据库 2.1.修改表结构 ①:更改字段类型长度 AL ...

  8. iOS数据库操作流程

    SQLite最新的版本是3.0,使用之前应该先导入libsqlite3.0.dylib 1.导入流程 2.iOS中操作数据库的流程 打开数据库 准备SQL数据库 执行SQL数据库 语句完结 关闭数据库 ...

  9. iOS数据库离线缓存思路和网络层封装

    一直想总结一下关于iOS的离线数据缓存的方面的问题,然后近期也简单的对AFN进行了再次封装.全部想把这两个结合起来写一下.数据展示型的页面做离线缓存能够有更好的用户体验,用户在离线环境下仍然能够获取一 ...

  10. iOS 数据库sqlite3.0操作--超简单--看我就够啦

    iOS客户端数据存储的方式有很多,下面主要是介绍苹果自带的sqlite3.0的使用方法. 首先导入sqlite3.0的框架.然后导入头文件#import <sqlite3.h>就行了 下面 ...

随机推荐

  1. HTML页面为什么设置了UTF-8仍然中文乱码

    如题,其实问题很简单,在用EditPlus写html页面的时候,发现设置为UTF-8的时候仍然出现了乱码,这是一个很奇怪的问题,而且我完全考虑了浏览器的解析问题,将title放在了了meta标签之后, ...

  2. 设置查看java的源程序

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  3. JVM 性能排查 自己做的笔记

    Live Memory 1.Class Tracker 展示类或包的实例个数与时间的关系.需要录制才可以看到. 1)可以添加指定的类或包. 2.All Objects 查看所有类的实例个数和大小.可以 ...

  4. C++中的垃圾回收和内存管理

    最开始的时候看到了许式伟的内存管理变革系列,看到性能测试结果的时候,觉得这个实现很不错,没有深入研究其实现.现在想把这个用到自己的一个项目中来,在linux下编译存在一些问题,所以打算深入研究一下. ...

  5. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...

  6. passwd讲解

    root:$dffjioowwf/:16274:0:999999:7::: 1用户名:密码:最近修改密码的日期:密码不能更改的天数:密码过期时间:密码需要更改期限到拉前7发出警告:宽限天数:帐号过期时 ...

  7. http://www.himigame.com/mac-cocoa-application/893.html

    [Cocoa(mac) Application 开发系列之一]创建第一个application—计算器 终于HTTP与Socket服务器以及cocos2dx之间的通信各种框架成功完成后,现在抽时间学习 ...

  8. HDU3336(KMP + dp)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. IEEE 802.15介绍

    1. 无线通信 无线通信主要是利用无线电(Radio)射频(RF)技术的通信方式,无线网络是采用无线通信技术实现的网络无线网络可为两种: 近距离无线网络和远距离无线网络 近距离无线网络主要可分为如下两 ...

  10. celery-分布式任务队列-原理

    # 转自:https://www.cnblogs.com/forward-wang/p/5970806.html 在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模 ...