iOS数据库的基本使用
今天总结下数据库的基本使用方法:
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数据库的基本使用的更多相关文章
- iOS 数据库操作(使用FMDB)
iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...
- [iOS]数据库第三方框架FMDB详细讲解
[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...
- IOS数据库操作SQLite3使用详解(转)
iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...
- IOS数据库FMDB增、删、改、查的使用【原创】
http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...
- iOS数据库操作之coredata详细操作步骤
CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...
- 分享一段ios数据库代码,包括对表的创建、升级、增删查改
分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...
- ios数据库
1. ios数据库管理软件 ios使用的数据库是sqlite 管理软件有2种, 我只记得一种, 名字叫做 MesaSQLite 2. sqlite数据库 2.1.修改表结构 ①:更改字段类型长度 AL ...
- iOS数据库操作流程
SQLite最新的版本是3.0,使用之前应该先导入libsqlite3.0.dylib 1.导入流程 2.iOS中操作数据库的流程 打开数据库 准备SQL数据库 执行SQL数据库 语句完结 关闭数据库 ...
- iOS数据库离线缓存思路和网络层封装
一直想总结一下关于iOS的离线数据缓存的方面的问题,然后近期也简单的对AFN进行了再次封装.全部想把这两个结合起来写一下.数据展示型的页面做离线缓存能够有更好的用户体验,用户在离线环境下仍然能够获取一 ...
- iOS 数据库sqlite3.0操作--超简单--看我就够啦
iOS客户端数据存储的方式有很多,下面主要是介绍苹果自带的sqlite3.0的使用方法. 首先导入sqlite3.0的框架.然后导入头文件#import <sqlite3.h>就行了 下面 ...
随机推荐
- js 内置对象属性及方法
1.Date 属性(1): constructor 所建立对象的函数参考 prototype 能够为对象加入的属性和方法 方法(43): getDay() 返回一周 ...
- 解析 Array.prototype.slice.call(arguments,0)
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- codevs 3305 水果姐逛水果街Ⅱ&&codevs3006
题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...
- LeetCode 4 :Majority Element
problem:Given an array of size n, find the majority element. The majority element is the element tha ...
- JAVA开发环境及其开发
成功安装之后,进行测试是否真的成功安装,点击[开始]----[运行]----输入 CMD,在命令提示符里面输入"Java -version"并按回车键,出现下图,即为安装成功. 选 ...
- python多线程实现多任务
#转载请联系 1.什么是线程? 进程是操作系统分配程序执行资源的单位,而线程是进程的一个实体,是CPU调度和分配的单位.一个进程肯定有一个主线程,我们可以在一个进程里创建多个线程来实现多任务. --- ...
- nginx反向代理部署nodejs配置
将域名abc.com反向代理到127.0.0.1:8888 upstream nodejs { server 127.0.0.1:8888; keepalive 64; } server { list ...
- 云平台资源挂盘办法V1.2
一.优先使用mount 方式进行挂盘,记得使用sync参数,如果对方网络限制了445端口,我们被迫采用第二种办法. mount -t cifs -o sync,username='Administra ...
- wxBot微信机器人框架(转)
原文:http://blog.csdn.net/tobacco5648/article/details/50722321 wxBot 是Python包装Web微信实现的微信机器人框架.可以很容易地实现 ...
- hdu5790
都快忘了在这类题的经典做法了…… 将字符串一个个的插入字典树,在字典树维护好有该前缀串s的最大编号字符串j,我们记作j控制了前缀串s 对于当前的第i个字符串,维护此时有当前每个字符串控制了多少个前缀串 ...