sqlite数据库

1、建立连接数据库

存储类型

integer:整型值

real:浮点值

text:文本字符串

blob:二进制数据(比如文件)

实际上SQLite是无类型的

2、DDL

创建表

create table"t_product"("pid"integer,"pName"text,"pPrice"real);

IF NOT EXISTS

数据库执行下面字符串,可创建表

@" create table if not exists t_illness (id integer primary key autoincrement,illnessType text,illnessDetail text,pinyin text,py text);delete from t_illness ;";

删除表使用的时候要注意不要瞎删

drop table"t_product"

3、DML

(1)insert插数据

insert into"t_student"(id,name,age,score) values (3,'基佬',17,2.0);

insert into t_student  values(9999,'jim3',11,222)

@"insert into t_person (pName,pAge) values ('%@',%d)"

如果需要往所有字段添加数据,那么可以省略字段名

(2)更新数据所有age和score都变成90和20

update"t_student"set score =90,age =20

指定条件

@"update t_person set pName='%@',pAge =%d where pid = %d"

update"t_student"set score =1001where age =20

update"t_student"set age =5where age >10and name!='jack'

(3)删除表的内容

delete from"t_student"

注意这样写把表中所有的数据都删光了

--删除某行数据

@"delete from t_person where pid=%d"

delete from"t_student"whereid=2

delete from"t_student"where age <=10or age>30

(4)查询

@"select * from t_person"

模糊搜索

@"select * from t_doctor where (doctor_name like '%%%@%%') or (doctor_title_name like '%%%@%%') or (doctor_hospital_name like '%%%@%%') or (pinyin like '%%%@%%') or (py like '%%%@%%') ",string,string,string,string,string]];

4、起别名

格式(字段和表都可以起别名)

select字段1别名,字段2别名,…from表名别名;

select字段1别名,字段2as别名,…from表名as别名;

select别名.字段1,别名.字段2, …from表名别名;

5、计算记录的数量

selectcount(字段)from表名;

selectcount(*)from表名;

6、排序

select*fromt_studentorder byagedesc;//降序

select*fromt_studentorder byageasc;//升序(默认)

select*fromt_studentorderbyageasc,heightdesc;

先按照年龄排序(升序),年龄相等就按照身高排序(降序

7、limit跳过最前面4条语句,然后取8条记录

select*from表名limit数值1,数值2;

select*fromt_studentlimit7;

相当于select*fromt_studentlimit0,7;

8、简单约束

not null:规定字段的值不能为null

unique:规定字段的值必须唯一

default:指定字段的默认值

createtablet_student(idinteger, nametextnotnullunique,ageintegernotnulldefault1);

name字段不能为null,并且唯一

age字段不能为null,并且默认为1

主键(PrimaryKey,简称PK)用来唯一地标识某一条记录

例如t_student可以增加一个id字段作为主键,相当于人的身份证

createtablet_student(idintegerprimary key,nametext,ageinteger);

//id" integer DEFAULT 1 PRIMARY KEY AUTOINCREMENT

只要声明为primarykey,就说明是一个主键字段

主键字段默认就包含了notnull和unique两个约束

如果想要让主键自动增长(必须是integer类型),应该增加autoincrement

外键约束

利用外键约束可以用来建立表与表之间的联系

外键的一般情况是:一张表的某个字段,引用着另一张表的主键字段

CONSTRAINT "class" FOREIGN KEY ("className") REFERENCES "t_className" ("clsID")

constraint

9、多表查询(面试一定会问)

1.嵌套查询

select className from t_className where clsID=(select className from t_student where name = 'xx')

2.自然连接如果数据量很大连接的时候耗费性能

select clsName from t_classroom ,t_student where classRoomid = clsID and name ='jack

10、sqlite3.h创建,yymodel

#import

(1)NSString*cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject];

NSString*dbFilePath = [cachePathstringByAppendingPathComponent:@"demo.db"];

创建数据库并打开1.db文件的路径2.sqlite3输出参数数据库句柄(对象)

(2)//通过读取本地的sql文件导入表结构

NSString*sqlFilePath = [[NSBundlemainBundle]pathForResource:@"t_person.sql"ofType:nil];

NSString*str = [NSStringstringWithContentsOfFile:sqlFilePathencoding:NSUTF8StringEncodingerror:nil];

执行sql,,,传入sql并调用这个可以增删改数据库,,一开始调用sql可以导入表格

sqlite3*,                                   An open databas个已经打开的数据库

// const char *sql,                           /* SQL to be evaluated sql语句

// int (*callback)(void*,int,char**,char**),  /* Callback function回调*/

// void *,                                    /* 1st argument to callback第一个参数*/

// char **errmsg                              /* Error msg written here错误*/

if(sqlite3_exec(_db, sql.UTF8String,NULL,NULL,NULL) ==SQLITE_OK) {

表的内容如下

IF NOT EXISTS   如果不存在,则创建

CREATE TABLEIF NOT EXISTS"t_person" (

"pid" integer DEFAULT 1 PRIMARY KEY AUTOINCREMENT,

"pName" text,

"pAge" integer

);

(3)执行代码

if(sqlite3_exec(_db, sql.UTF8String,NULL,NULL,NULL) ==SQLITE_OK) {

returnYES;

};

(4)查

思路:先通过预编译sqlite3_prepare_v2获取sqlite3_stmt,进行循环判断sqlite3_step(stmt) ==SQLITE_ROW,获取sqlite3_column_count(stmt)列的个数,循环获取列对应的名字和值,sqlite3_column_name(stmt, i)获取对应第i列的名字,sqlite3_column_type(stmt, i)获取第i列对应的值得类型,sqlite3_column_int(stmt, i);根据类型获取值,mdic[colNameStr] =@(colValue);以这个形式加入到可变数组中

//预编译sql

1.数据库的句柄2.要编译的语句3.sql的长度4.输出参数预编译后的对象5.指针指向sql中没有使用的部分

sqlite3_stmt*_stmt;NSArray*array;

if(sqlite3_prepare_v2(_db, sqlString.UTF8String, -1, &_stmt,NULL) ==SQLITE_OK) {

//根据预编译的sql获取执行后的结果集合

- (NSArray*)getRecordsWithStmt:(sqlite3_stmt*)stmt {

NSMutableArray*mArray = [NSMutableArrayarray];

获取key(列名)对应的值

//获取下一行的数据返回是否还有数据

while(sqlite3_step(stmt) ==SQLITE_ROW) {

//获取该行的信息    一行就是一个model,即一个字典,,列是键值对对应的值

NSMutableDictionary*mDic = [NSMutableDictionarydictionary];

//获取数据集合有几列

intcolCount =sqlite3_column_count(stmt);

for(inti =0; i < colCount; i++) {

//取列名字作为key

constchar*colNameChar =sqlite3_column_name(stmt, i);

//转换为nsstring

NSString*colNameStr = [NSStringstringWithUTF8String:colNameChar];

//获取数据类型

intcoltype =sqlite3_column_type(stmt, i);

switch(coltype) {

caseSQLITE_INTEGER: {

intcolValue =sqlite3_column_int(stmt, i);

mDic[colNameStr] =@(colValue);

}

break;

caseSQLITE_TEXT: {

constchar* colValue =(constchar*)sqlite3_column_text(stmt, i);

mDic[colNameStr] = [NSStringstringWithUTF8String:colValue];

}break;

caseSQLITE_FLOAT: {

doublecolValue =sqlite3_column_double(stmt, i);

mDic[colNameStr] =@(colValue);

}break;

default:

break;

}

}

[mArrayaddObject:mDic.copy];

}

11、//字典数组转模型数组

1.数组中的元素类型

2.数据源

[NSArrayyy_modelArrayWithClass:[selfclass]json:dicArray];

12、创建模型,json直接转模型

HMPersonModel*person = [HMPersonModelyy_modelWithJSON:jsonStr];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容