SQLite之写一个表
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之写一个表的更多相关文章
- CBrother脚本10分钟写一个拯救“小霸王服务器”的程序
CBrother脚本语言10分钟写一个拯救“小霸王服务器”的程序 到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重 ...
- Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
JEECG 智能开发平台. 开发模式由代码生成器转变为Online Coding模式 (通过在线配置实现一个表模型的增删改查功能,无需一行代码,支持用户自定义 ...
- sqlite创建数据库并创建一个表
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- 在数据库里面有这么一个表:用m代表男,用f代表女,现在我要输出格式为中文的:男和女,sql语句该怎么写
在数据库里面有这么一个表:用m代表男,用f代表女,现在我要输出格式为中文的:男和女, sql语句该怎么写 select case sex when 'm' then '男' else '女' a ...
- 自己写一个 Hash 表
项目地址: https://github.com/kelin-xycs/HashTableLib 为什么会想要自己写一个 Hash 表, 以前也想过 Hash 表 的 原理, 觉得很神奇, 不过最近 ...
- 写一个方法,用一个for循环打印九九乘法表
public class MultiplicationTable { /** * @description 写一个方法,用一个for循环打印九九乘法表 * @author wangkun * ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...
- 写一个TODO App学习Flutter本地存储工具Moor
写一个TODO App学习Flutter本地存储工具Moor Flutter的数据库存储, 官方文档: https://flutter.dev/docs/cookbook/persistence/sq ...
随机推荐
- Chrome 和 Webkit 的渊源
互联网的浪潮从未停息,而用以网上冲浪的冲浪板也一直在变得愈加精良.自人们进入互联网时代以来,即已经发生了三次浏览器大战.第一次浏览器大战的主角是IE和Netscape,最终IE凭借着Windows的庞 ...
- Android SharedPreferences 见解
今天突然遇到了SharedPreferences问题,虽然以前用过,但从没有深入的了解一下,今天就顺便深入了解一下,并总结一下,防止以后忘记. SharePreferences是Android平台上一 ...
- uitextview 最后一行遮挡
这只 uiscrollerview 的 setContentOffset CGRect line = [textView caretRectForPosition: textView.selected ...
- java基础回顾(六)——WeakReference、SoftReference
在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1) ...
- ionic cordova social media sharing plugin
https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin.git 从上面的连接下载 插件 1.肯定是要加入 下面的那个文件的吖 从 ...
- ionic cordova plugin simple demo
要用cordova plugin 的话还是需要设置一下的 1. 下载 ng-cordova.js download the zip file here 2. 在index.html 中引用 (cord ...
- hql 关联查询
HQL 带的连接语句只能是实体与 该实体的属性 进行连接 其意义就是为了优化(通过延迟加载查询关联的属性)需要进行配置 from A left join A.B where (b.flag is nu ...
- HTTP CHUNKED C实现
C语言不像C#一样有很多很多高度的模块化的东西可以使用,在通讯过程中特别是与http相关的通讯过程中可能要对网站返回的数据做一定处理,而且有不少网站的回应是强制性的,例如向网站请求deflate有个能 ...
- 【风马一族_mysql】MySQL免安装版环境配置图文教程
mysql存放在某一个磁盘中(笔者使用E盘) 配置系统变量 打开 电脑的属性 点击 高级系统设置 选择 高级 点击 环境变量 选择 系统变量 点击 变量Path,追加 值 E:\mysql-5.6.2 ...
- Python网络编码
#-*- coding:utf-8 -*- from SocketServer import ThreadingTCPServer, StreamRequestHandler import trace ...