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>就行了 下面 ...
随机推荐
- eclipse console输出有长度限制
抓取一个网页内容,然后打印到控制台,发现内容首部都没有了. String content = getResponseText("http://xxx.html"); System. ...
- npm安装node-sass失败,EACCES: permission denied
增加--unsafe-perm,即 sudo npm install node-sass --unsafe-perm --save-dev 成功安装node-sass
- es6+最佳入门实践(8)
8.Promise 8.1.什么是异步? 要理解异步,首先,从同步代码开始说 alert(1) alert(2) 像上面的代码,执行顺序是从上到下,先后弹出1和2,这种代码叫做同步代码 alert(0 ...
- VR行业纷纷倒闭:有硬件没内容
从去年年底开始,VR就成为了一个流行词汇,不仅是巨头公司砸钱布局,众多创业公司也纷纷投入其中.但是,一窝蜂拥入的企业基本都没有成熟的商业模式和赢利模式,只能靠融资供血.在资本寒冬中,大部分的VR企业开 ...
- 【BZOJ】1596: [Usaco2008 Jan]电话网络
[算法]树上贪心 [题解] 因为一个点必须被覆盖,那么它如果没有被子树节点覆盖的话,就覆盖它的父节点. 从叶子开始贪心. 注意,如果它自己已经被选了就不需要选父节点了. #include<cst ...
- 我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。
把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 2016.7.18 refactor s ...
- unet中可视性检查的一些笔记
最近在尝试用unet做一个局域网游戏,游戏的核心概念在于玩家之间的发现和隐蔽,有个类似于战争迷雾的机制. 实现该机制最关键的是实现可视性检查.首先是unet中默认的一个可视性检查,由组件Network ...
- 专业术语/Java专有名词
微服务 Web Service WebAPI(MicroSoft) RESTful RPC 微服务 服务拆分,利用轻量化机制(通常为HTTP源API)实现通信,复杂度可控,独立部署,技术选型灵活,容错 ...
- 转:java读取配置文件的几种方法
转自: http://www.iteye.com/topic/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小 ...
- Map占用内存大小评估
public class test { private static java.util.HashMap<String, String> needQueryResProductList = ...