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>就行了 下面 ...
随机推荐
- Servlet的doGet与doPost方法的区别与使用
Servlet的doGet与doPost方法的区别与使用 2016年07月07日 13:05:13 阅读数:10222 一,区别 在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个 ...
- 【BZOJ2227】【ZJOI2011】看电影 [组合数][质因数分解]
看电影 Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看 ...
- 文本区 JTextArea 的使用
文本区JTextArea是对多行文本进行编辑的组件,用空字符来控制文本的格式.eg:"\n"为换行,"\t"为插入一个Tab字符. 文本去JTextArea的常 ...
- ATL CLR MFC Win32 常规 的区别
ATL用于编写COM程序,CLR是.NET的公共语言运行库,MFC是指MFC类库,MFC程序是用这些类库做出的程序,WIN32常规就是不用 MFC,使用API函数编的程序. MFC.ATL和CLR是V ...
- 分析函数调用堆栈的原理和Delphi实现
来自:http://blog.163.com/liuguang_123/blog/static/816701920105262543890/ ----------------------------- ...
- ttk.Treeview
TTK的目的. TreeView控件的呈现层次结构,用户可以使用鼠标动作来显示或隐藏结构的任何部分. 与术语“树”的关联是由于编程实践:树结构是一个常见的程序设计.严格地说,在一个TreeView控件 ...
- k8s job的使用
1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...
- TCP,UDP,IP包头格式及说明(zz)
一.MAC帧头定义 /数据帧定义,头14个字节,尾4个字节/ typedef struct _MAC_FRAME_HEADER { ]; //目的mac地址 ]; //源mac地址 short m_c ...
- Android 判断SD卡是否存在和使用容量查询
1.判断SD卡是否存在 返回true表示存在 /* 判断SD卡是否存在 返回true表示存在 */ public boolean avaiableMedia() { String status = E ...
- [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3202 Solved: 1198[Submit][Status ...