iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去。
一种方法是从外面拷贝到程序里:http://www.cnblogs.com/Steak/p/3764395.html
另一种方法就是直接创建表,既然是操纵数据库,那么一定有一个数据库对象,sqlite是C库,所以需要一个C变量:
@interface DBHandler () {
sqlite3 *db;
}
在沙盒Documents文件夹里创建一个数据库文件,如果数据库不存在,sqlite3_open函数则会创建一个文件:
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
NSString *dataBasePath = [[NSString alloc] initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]];
int result = sqlite3_open([dataBasePath UTF8String], &db);
返回值是一个宏定义,如果成功则是SQLITE_OK,需要注意的是每次执行数据库操作的时候都需要open,完事之后都要调用对应的close。
对于打开和关闭的时机,有两种说法,一种是始终保持打开,另一种说法是随用随开关,个人比较倾向后者。
创建表:
char *sql = "create table if not exists for_persons (id integer primary key autoincrement, name text, age integer);";
char *error;
int result = sqlite3_exec(db, sql, NULL, NULL, &error);
增删改:
char *sql = "insert into for_persons(name, age) values(?, ?)";
sqlite3_stmt *stmt;
int result = sqlite3_prepare_v2(db, sql, -, &stmt, NULL);
if (result == SQLITE_OK) {
sqlite3_bind_text(stmt, , "xiaoming", -, NULL);
sqlite3_bind_int(stmt, , );
if (sqlite3_step(stmt) == SQLITE_DONE) {
//成功
}
else {
//失败
}
}
else {
//语法检查失败
}
sqlite3_finalize(stmt);
这里以增加为例子,增删改都要定义一个sqlite3_stmt,并且在最后释放掉,然后通过sqlite3_prepare_v2对sql进行检查,检查成功后通过sqlite3_bind_XXX方法进行数据绑定,然后通过sqlite3_step执行sql语句。增删改的格式都是一样的。
查询数据:
char *sql = "select * from for_persons";
sqlite3_stmt *stmt;
int result = sqlite3_prepare_v2(db, sql, -, &stmt, NULL);
if (result == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
int ID = sqlite3_column_int(stmt, );
char *name = (char *)sqlite3_column_text(stmt, );
int age = sqlite3_column_int(stmt, ); //到这里已经完整读出了一条记录
//如果有多条数据,可以在外面定义数组保存
}
}
查询也类似,需要使用while (sqlite3_step(stmt) == SQLITE_ROW)来判断如果还有下一条就取出来。
以上是原生sqlite3最基本的使用,但是这种C风格的代码看着就反胃,复制粘贴都没有胃口。
还好有人封装了一个很方便的第三方库叫FMDB。下面说说FMDB的使用,首先下载FMDB:https://github.com/ccgus/fmdb,同样导入libsqlite3.dylib,并且#import "FMDatabase.h"。
创建库文件并打开的代码很类似,不过都是OC代码,看起来舒服多了:
@interface DBHandler () {
FMDatabase *db;
}
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
NSString *dataBasePath = [[NSString alloc] initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]];
db = [FMDatabase databaseWithPath:dataBasePath];
[db open];
创建表:
NSString *sql = @"create table if not exists for_persons (id integer primary key autoincrement, name text, age integer);";
[db executeUpdate:sql];
代码一下子简单了,executeUpdate返回一个BOOL值。
增删改:
[db executeUpdate:@"insert into for_persons(name, age) values(?, ?)", @"xiaowang", @];
同样都是使用executeUpdate方法,这里的问号相当于NSString当中的@,是个OC对象占位符。
执行查询也是OC风格的:
FMResultSet *rs = [db executeQuery:@"select name, age from for_persons where name = ?", @"xiaowang"];
while ([rs next]) {
NSString *name = [rs stringForColumn:@"Name"];
int age = [rs intForColumn:@"Age"];
NSLog(@"%@%d", name, age);
}
[rs close];
iOS使用sqlite3原生语法进行增删改查以及FMDB的使用的更多相关文章
- idea原生ajax数据处理(增删改查)
项目名称:Bookstore UI界面 项目文件 操作: jsp代码 <%@ page import="dao.BookDAO" %> <%@ page impo ...
- Python之MySQL语法(增删改查)
-- ID: 新闻的唯一标示 -- title: 新闻的标题 -- content: 新闻的内容 -- created_at: 新闻添加的时间 -- types: 新闻的类型 -- image: 新的 ...
- Sqlite3 实现学生信息增删改查
import sqlite3 conn = sqlite3.connect('studentsdb.db') # 连接数据库 cursor = conn.cursor( ) # 创建数据表 def c ...
- (五)JPA - 原生SQL实现增删改查
6.原生SQL JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持.下面小节一起来看看吧. 6.1 查询单个 示例代码: @Test public void getSingle() { E ...
- PHP---Mysql常用语法(增删改查)
1.数据库操作: 创建数据库:create databas ...
- Android_ADB 常用 shell命令 和 sqlite3 简单增删改查
今天学习了一个ADB的常用命令.接下来简单使用几个常用ADB shell 命令. 首先我们得明白什么是adb.exe ADB -Android Debug Bridge, 是 Android sdk ...
- java使用原生MySQL实现数据的增删改查以及数据库连接池技术
一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: <dependency> <groupId> ...
- iOS sqlite 增删改查 简单封装(基于 FMDB)
/** * 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * * 基于 FMDB * * 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...
- laravel 使用构造器进行增删改查
使用原生语句进行增删改查 //$list = DB::select('select * from wt_category where id = :id', ['id' => 34]); //$i ...
随机推荐
- 【stm32】ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的:可能有时候会需要立刻采样,那样我们就需要利用到注入通道 ...
- javascript模式
http://developer.51cto.com/art/201212/372725.htm http://justjavac.com/javascript/2012/12/14/model-vi ...
- VC++学习之一
对于编程语言,我一直认为它只是一种工具,就像锤子,斧头一样,每种语言都用自己比较适用的地方,用的时候拿来就可以了.这种思想让我对语言没有做过很仔细的学习,虽然频繁使用过C,C++,java,C#,De ...
- jsp验证码页面笔记
首先在网上搜了下jsp生成验证码的代码,如下: package com.servlet; import java.awt.Color; import java.awt.Font; import jav ...
- 求链表的倒数第k个节点
问题描述:给定一个链表的头节点,求出链表的倒数第k个节点. 分析:这是链表里的经典问题,存在多种解法,下面给大家分享下我的想法. 解法一:很直观的一种做法是从头到尾扫描链表,然后求倒数第k个,但是由于 ...
- Java报错--Unsupported major.minor version 52.0
遇到一个Java相关的报错: ... java.lang.UnsupportedClassVersionError: ... : Unsupported major.minor version 52. ...
- ORACLE MTTR
实例恢复时间:指的是将数据文件的最后一个检查点(检查点位置)推进到控制文件中记录的最新SCN 所需的时间.管理员可以通过设置MTTR 目标以及调整重做日志组的大小来控制该时间.MTTR 指导:Mean ...
- 在一个RAC集群中最多支持多少节点
How many nodes can one have in an HP-UX/Solaris/AIX/Windows/Linux cluster? Technically and since Ora ...
- iOS设计模式解析(三)适配器模式
适配器模式:将一个类的借口转换成客户端希望的另一个接口 有一个很直观的图: 例如 :电源适配器(将110V电压转换成220V电压,其中Traget是220V电压,adaptee就是110V电 ...
- 华为S5700基础配置----备份和恢复配置文件
一:备份配置文件 设备作为FTP服务器,用户PC作为FTP客户端 # 配置设备的FTP功能及FTP用户信息. <HUAWEI> system-view [HUAWEI] ftp serve ...