1.首先你需要一个路径。 

  

获取document目录并返回数据库目录

- (NSString *)dataFilePath{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSLog(@"=======%@",documentsDirectory);

return [documentsDirectory stringByAppendingPathComponent:@"data.db"];

}

2.   创建个打开数据库函数

- (BOOL)openDB{

//获取数据库路径

NSString *path = [self dataFilePath];

//文件管理器

NSFileManager *fileManager = [NSFileManager defaultManager];

//判断数据库是否存在

BOOL find = [fileManager fileExistsAtPath:path];

//如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)

if (find) {

NSLog(@"Database file have already existed.");

//打开数据库,这里的[path UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是

//Objective-C)编写的,它不知道什么是NSString.

if(sqlite3_open([path UTF8String], &_db) != SQLITE_OK) {

//如果打开数据库失败则关闭数据库

sqlite3_close(_db);

NSLog(@"Error: open database file.");

return NO;

}

//创建一个新表

[self craetLabel:_db];

return YES;

}

//如果发现数据库不存在则利用sqlite3_open创建数据库(上面已经提到过),与上面相同,路径要转换为C字符串

if(sqlite3_open([path UTF8String], &_db) == SQLITE_OK) {

//创建一个新表

[self craetLabel:_db];

return YES;

} else {

//如果创建并打开数据库失败则关闭数据库

sqlite3_close(_db);

NSLog(@"Error: open database file.");

return NO;

}

return NO;

}

3.创建表

- (BOOL)craetLabel:(sqlite3 *)adb{

//这句是大家熟悉的SQL语句

char *sql = "create table if not exists dataTable(ID INTEGER PRIMARY KEY AUTOINCREMENT, name text,sip text,type text,password text,ids text,deviceLogicId text)";// testID是列名,int 是数据类型,testValue是列名,text是数据类型,是字符串类型

_db = adb;

sqlite3_stmt *statement;

//sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法

NSInteger sqlReturn = sqlite3_prepare_v2(_db, sql, -1, &statement, nil);

//第一个参数跟前面一样,是个sqlite3 * 类型变量,

//第二个参数是一个 sql 语句。

//第三个参数我写的是-1,这个参数含义是前面 sql 语句的长度。如果小于0,sqlite会自动计算它的长度(把sql语句当成以\0结尾的字符串)。

//第四个参数是sqlite3_stmt 的指针的指针。解析以后的sql语句就放在这个结构里。

//第五个参数是错误信息提示,一般不用,为nil就可以了。

//如果这个函数执行成功(返回值是 SQLITE_OK 且 statement 不为NULL ),那么下面就可以开始插入二进制数据。

//如果SQL语句解析出错的话程序返回

if(sqlReturn != SQLITE_OK) {

NSLog(@"Error: failed to prepare statement:create data table");

return NO;

}

//执行SQL语句

int success = sqlite3_step(statement);

//释放sqlite3_stmt

sqlite3_finalize(statement);

//执行SQL语句失败

if ( success != SQLITE_DONE) {

NSLog(@"Error: failed to dehydrate:create table dataModel");

return NO;

}

NSLog(@"Create table 'dataTable' successed.");

return YES;

}

4.直接使用到的函数。插入数据

//插入数据

-(BOOL) insertList:(dataModel *)insertList {

//先判断数据库是否打开

if ([self openDB]) {

sqlite3_stmt *statement;

//这个 sql 语句特别之处在于 values 里面有个? 号。在sqlite3_prepare函数里,?号表示一个未定的值,它的值等下才插入。

static char *sql = "INSERT INTO dataTable(name,sip,type,password,ids,deviceLogicId) VALUES(?,?,?,?,?,?)";

int success2 = sqlite3_prepare_v2(_db, sql, -1, &statement, NULL);

if (success2 != SQLITE_OK) {

NSLog(@"Error: failed to insert:testTable");

sqlite3_close(_db);

return NO;

}

//这里的数字1,2,3代表上面的第几个问号,这里将三个值绑定到三个绑定变量

sqlite3_bind_text(statement, 1, [insertList.name UTF8String], -1,SQLITE_TRANSIENT);

sqlite3_bind_text(statement, 2, [insertList.sip UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(statement, 3, [insertList.type UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(statement, 4, [insertList.password UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(statement, 5, [insertList.ids UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_bind_text(statement, 6, [insertList.deviceLogicId UTF8String], -1, SQLITE_TRANSIENT);

//执行插入语句

success2 = sqlite3_step(statement);

//释放statement

sqlite3_finalize(statement);

//如果插入失败

if (success2 == SQLITE_ERROR) {

NSLog(@"Error: failed to insert into the database with message.");

//关闭数据库

sqlite3_close(_db);

return NO;

}

//关闭数据库

sqlite3_close(_db);

return YES;

}

return NO;

}

调用方法:实例化此类,直接使用insertList方法,遍历数据源数组使用。model根据数据类型自定义。

SQLite之写一个表的更多相关文章

  1. CBrother脚本10分钟写一个拯救“小霸王服务器”的程序

    CBrother脚本语言10分钟写一个拯救“小霸王服务器”的程序 到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重 ...

  2. Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)

    JEECG 智能开发平台. 开发模式由代码生成器转变为Online Coding模式                      (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义 ...

  3. sqlite创建数据库并创建一个表

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  4. 在数据库里面有这么一个表:用m代表男,用f代表女,现在我要输出格式为中文的:男和女,sql语句该怎么写

    在数据库里面有这么一个表:用m代表男,用f代表女,现在我要输出格式为中文的:男和女, sql语句该怎么写 select  case sex when 'm' then '男' else '女'   a ...

  5. 自己写一个 Hash 表

    项目地址:  https://github.com/kelin-xycs/HashTableLib 为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇, 不过最近 ...

  6. 写一个方法,用一个for循环打印九九乘法表

    public class MultiplicationTable { /**  * @description 写一个方法,用一个for循环打印九九乘法表   * @author  wangkun  * ...

  7. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)

    写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...

  8. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  9. 写一个TODO App学习Flutter本地存储工具Moor

    写一个TODO App学习Flutter本地存储工具Moor Flutter的数据库存储, 官方文档: https://flutter.dev/docs/cookbook/persistence/sq ...

随机推荐

  1. [前端 1] 使用frameset框架构建网页基本布局

    导读:在做项目的过程中,发现网页的一些地方是不变的,比如说顶部.底部.而变幻的内容就只是一部分.这个时候在想,这是每次都刷新一个界面呢,还是有别的快捷方法呢.然后就找到了frameset 这个东西.本 ...

  2. sass mapsource --->gulp

    详细,请戳这里 1.安装插件 npm install --save-dev gulp-sass gulp-sourcemaps gulp-autoprefixer 如果安装错误,请用sudo 权限: ...

  3. Visual Studio 中 Tab 转换为空格的设置

    Visual Studio 中 Tab 转换为空格的设置 在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效果.Visual St ...

  4. 单例模式(Winform窗体的实现)

    在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...

  5. 设计模式-观察者模式(Observer)

    简介: 观察者模式,也称为订阅-发布模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并被自动更新. 主要由以下几个部分组成: a.Subject目标对象. ...

  6. javascritp日期函数总结

    getDate()与getDay()的区别: obj.getDate()返回一个月中的某一天:obj.getDay()返回一个星期中的某一天. getYear()与getFullYear()的区别: ...

  7. 《第一行代码--Android》阅读笔记之数据持久化

    1.升级数据库 为了避免手工清空数据(或卸载重装APP),重写SQLiteOpenHelper里面的onUpgrade()方法   引用自http://blog.csdn.net/longvslove ...

  8. Jquery调用Webservice传递Json数组

    Jquery由于提供的$.ajax强大方法,使得其调用webservice实现异步变得简单起来,可以在页面上传递Json字符串到Webservice中,Webservice方法进行业务处理后,返回Js ...

  9. 【转】利用DCC32实现命令行批量编译

    *.dof [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 ...

  10. MYSQL数据库表中字段追加字符串内容

    $sql="update parts set p_notes=concat(p_notes,'{$p_notes}') where p_id={$p_id}"; parts为表名 ...