//此文仅为课堂学习笔记,感谢肖老师
数据持久化
NSUserDefaults
plist
归档/解档
SQLite:把内存中的数据存到磁盘(文件)
…
SQLite 是一个开源的嵌入式的关系型数据库
增/删/改/查:
CRUD: Create / Retrieve / Update / Delete0
情况一:没有数据库
1,创建数据库文件(SQLite)
test
2,创建表(一个数据库可以包含非常多的表)
create table people (id integer, name text, age integer, class text);
3,增/删/改/查(数据库)
增:插入(insert)数据
insert into people (id,name,age,class) values (1,’Bob’,19,’1602’);
改:更新(update)数据
update people set age = 17 where name = ‘Bob’;
查:查询(select)数据
select *from people where age < 18 or class = ‘1602’;
删:删除(delete)数据
delete from people where name = ‘Bob’;
情况二:有包含数据的数据库文件
读取数据库文件
只说2个。可视化软件操作/XCode
Xcode:
样例(理解):使用OC语言实现下面功能(操作数据库中的数据)
【Demo01_SQLite】
-> 前提:手动导入sqlite3.0.tbd库+import头文件
-> 需求如下(OC代码 -> sqlite3.0.tbd库 -> sqlite数据库数据)
a. 创建数据库文件(SQLite)
b. 创建表(一个数据库可以包含非常多表)
c. 增/删/改/查(操作数据)
//**********************************
//需求:对数据库中的数据进行增/删/改/查
//1.创建数据库(文件: 路径+文件名字)
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
//db: database(数据库)
NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@"test.sqlite"];
/*参数一:数据库文件所在路径
参数二:给定数据库类型对象地址
功能:既创建一个数据库文件;又把数据库文件打开(有权限对数据库进行操作)
*/
sqlite3 *db = NULL;
int ret = sqlite3_open([dbFilePath cStringUsingEncoding:NSUTF8StringEncoding], &db);
if (ret != SQLITE_OK) {
NSLog(@"创建数据库文件失败:%s", sqlite3_errmsg(db));
}
//2.创建表(SQL语句)
//exec全称:execute
/* 参数二:要执行的SQL语句
*/
const char *createTable = "create table if not exists people (id integer, name text, age integer, class text)";
char *errmsg = NULL;
ret = sqlite3_exec(db, createTable, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
NSLog(@"创建表失败:%s", errmsg);
}
//3.增/删/改/查
const char *insertStr = "insert into people (id,name,age,class) values (1,'Jonny',19,'1602')";
ret = sqlite3_exec(db, insertStr, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
NSLog(@"无法插入数据:%s", errmsg);
}
//查询操作
/*参数一:数据库对象
参数二:要执行的查询SQL语句
参数三:每次最大要执行的SQL语句的字节数
参数四:查询结果存在该参数中
参数五:NULL(指向下次未执行的SQL语句部分)
*/
const char *selectStr = "select * from people";
sqlite3_stmt *stmt; //statement缩写
ret = sqlite3_prepare(db, selectStr, -1, &stmt, NULL);
if (ret == SQLITE_OK) {
//获取成功;循环从stmt变量中取值
while (sqlite3_step(stmt) == SQLITE_ROW) {
//如果调用的step方法的返回值等于SQLITE_ROW(100), 还有下一条记录;如果不等于,循环结束(没有记录)
//根据不同字段的类型,选择不同的方法
//id(参数二:字段对应的列下标)
int idValue = sqlite3_column_int(stmt, 0);
//name
const unsigned char *name = sqlite3_column_text(stmt, 1);
//age
int age = sqlite3_column_int(stmt, 2);
//class
const unsigned char *class = sqlite3_column_text(stmt, 3);
printf("id:%d; name:%s; age:%d; class:%s\n\n", idValue, name, age, class);
}
//手动调用方法释放stmt占用的内存
sqlite3_finalize(stmt);
}
//收尾工作(打开数据库有一个连接; 不使用需要关闭数据库连接)
sqlite3_close(db);