###iOS数据库存储
* 表连接的解释
http://www.blogjava.net/zolly/archive/2007/10/23/SQLJION.html
sqlite语句
一. 数据定义语句
//类型: integer整型 text文本 blob二进制 real浮点//创建表, 如果没有就创建
create table if not exists 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;
//如果表格存在就删除表格
drop table if exists 表名 ;
二. 数据操作语句
//将Values后面跟的值插入到前面表中对应的字段
insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;//更新对应字段的值
update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ;//删除表中记录
delete from 表名 ;
三. 条件语句
//当 2个条件同时成立where 字段1 = 某个值 and 字段2 > 某个值 ;
//当 2个条件有1个成立where 字段1 = 某个值 or 字段2 = 某个值 ;
四. 查询语句
// 查询指定表的某写字段名的值
select 字段1, 字段2, … from 表名 ;// 查询一张表中所有的记录 * --> 代表所有字段
select * from 表名;// 查询表中记录的个数
select count ( * ) from 表名 ;// 查询表中所有的记录, 并按照某个字段排序 默认升序, 如果要降序, 添加DESC
select * from t_student order by 字段;// 用于分页查询 参数1:索引 参数2:取值的个数// 查询记录, 根据指定的索引开始查询, 查询N个
select * from 表名 limit 数值1, 数值2 ;
五. 约束
//一般来说, not null, primary key简单约束: not null, unique, default主键约束: primary key外键约束: constraint "外键名称" foreign key ("当前表要添加外键约束的字段") references "另一张表名" ("另一张表的要添加约束的字段")
// 创建一个student表, 要求id字段整型, id是主键; name文本类型不能为空并且不能重复;age是整型不能为空, 默认为1// classID整型不能为空, 给classID增加了外键约束, 外键的名称是"fk_tstudent_classID_tclass_classID"// foreign key (classId)指定了当前表的某个字段要添加外键约束// references t_class (classID)): 连接的另一张表的要添加约束的字段
create table t_student (id integer primary key, name text not null unique, age integer not null default 1, classID integer not null , constraint fk_tstudent_classID_tclass_classID foreign key (classId) references t_class (classID)) ;
六. 表连接查询(多表查询)(起别名)
// 查询学生表中名字和年龄, 来自学生表(别名s) 班级表(别名=c) 绑定学生表中class_id和班级表中id关联 并且班级表中的name为"传智23期"
select s.name,s.age from t_student s, t_class c where s.class_id = c.id and c.name = ‘传智23期’;
FMDB
github地址https://github.com/ccgus/fmdb
需配合SQ语句使用
// 导入头文件
#import "FMDB.h"
// 数据库对象 FMDatabase
// 1. 创建并打开数据库 databaseWithPath 方法
// 2. 创建表 executeUpdate 返回值bool
// 3. 增加数据 删除数据 修改数据 都调用 executeUpdate相应方法
// 4. 查询数据 调用executeQuery 相应方法 返回值FMResultSet, FMResultSet有属性next可判 断有误下一条数据使用 string调用 int/.../stringFor 方法获取数据
cordData
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。简单地用下图描述下它的作用:
CoreData本质是一个ORM框架ORM Objective-Relational Mapping这个映射就是我们的模型文件,一般ORM框架都用XML格式来映射 实体Entity+属性数据库表,列
托管对象(entity) —既不是单纯的 内存对象,也不是数据库中的具体的数据,它介于这两个状态之间的,我们叫他游离态的数据
CoreData 不能执行SQL语句 取而代之,操作的是对象,FMDB SQLite 可以直接SQL语句
需要手画图!左边是关系模型,即数据库,数据库里面有张person表,person表里面有id、name、age三个字段,而且有2条记录;右边是对象模型,可以看到,有2个OC对象;利用Core Data框架,我们就可以轻松地将数据库里面的2条记录转换成2个OC对象,也可以轻松地将2个OC对象保存到数据库中,变成2条表记录,而且不用写一条SQL语句。
开发步骤总结:1.初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息2.初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)3.初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行CRUD(创建(Create)、更新(Update)、读取(Read)和删除(Delete))操作
CoreData的4个存储方式:
SQLiteNSSQLiteStoreType
XMLNSXMLStoreType
BinaryNSBinaryStoreType
内存存储NSInMemoryStoreType
CoreData 持久化协调器 - NSPersistentStoreCoordinator
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]
CoreData 对象映射模型 - NSManagedObjectModel
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
CoreData 托管对象上下文 - NSManagedObjectContext
指定队列_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
指定协调器[_managedObjectContext setPersistentStoreCoordinator:coordinator];
CoreDate 实体描述器 - NSEntityDescription
CoreData 托管对象 - NSManageObject