一般数据存储方式
- 文件读写,仅支持四种数据NSString、NSArray、NSDictionary、NSData
- 归档
NSUserDefaults偏好设置
这三种存储方式,要对某个数据作修改,都是整体覆盖操作,效率非常低。
SQLite
优点
- SQLite是以表的形式存数据,类似excel。要修改某一条数据,可以单独对其操作而不需要整体覆盖。
- 轻量级数据库,占用内存小,速度快,
- 跨平台,可以在iOS和安卓通用
命令
SQL:结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
常见的SQL语句有创建(Create),插入(Insert),更新(Update),删除(Delete),查询(Select)
SQLite具体操作
- 我这里用的是火狐浏览器的工具->附加组件中下载的SQLite manager来操作SQLite
创建
- 格式:create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型。。。)
- 图示创建一个Person,其中id是为了区别数据,同时要把它设置成主键,好处是主键不能为空,不能重复。写完语句点击Run SQL,就创建成功,左侧表里就多了一个Person
- 点击左侧表里的Person,点击右边structure可以查看结构
- 点击Browse&Search可以查看数据
插入
- 格式:insert into 表名称(列1,列2…)values(值1,值2…)。注意字符串一般用单引号’,双引号也可以
查询
- 格式:select 列名称 from 表名称
- 这里可以用*表示所有列
- 可以加后缀,多个条件
更新
- 格式:update 表名称 set 列名称 = 新值 where 列名称
- 如下把id = 2的列的name改成李四
删除
- 格式:delete from 表名 where 列名
在iOS中集成SQLite
- 手动导入框架:Build Phases ->Link Binary With Libraries -> + ->libsqlite3.0.tbd
- 导入头文件:sqlite3.h
- 一般创建一个管理类SQLiteManager,并且用单例模式
static SQLiteManager *_manager = nil;
+ (SQLiteManager *)shareManager{
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_manager = [super allocWithZone:zone];
});
return _manager;
}
- 提供一个打开数据库的方法
// 建个指针
sqlite3 *ppDb;
- (void)open{
// document路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 拼接数据库路径
NSString *SQLitePath = [documentPath stringByAppendingPathComponent:@"testSQLite.sqlite"];
// 打开数据库,这里需要把OC的字符串转换成C语言的字符串,第二个参数需要传入一个指针的地址
sqlite3_open(SQLitePath.UTF8String, &ppDb);
// 如果成功
if (result == SQLITE_OK)...else
// 如果失败
}
- 提供一个关闭数据库的方法
- (void)close{
int result = sqlite3_close(ppDb);
if (result == SQLITE_OK) ...
}
- 创建表的方法
- (void)creatList{
// SQL语句
NSString *sqlString = @"create table Person (id integer,name text,age integer)";
// 执行sql语句
// 第一个参数是sqlite3指针,第二个参数是sql语句,需要转一下,第三个参数是回调,这里直接nul,最后一个参数是错误信息,建个指针传进去
char *error = nil;
sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);
// 判断是否出现错误
if (error == nil) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"数据库执行结果" message:@"创建表成功" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
[alertView show];
}else{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"数据库执行结果" message:@"创建表失败" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
[alertView show];
}
}
- 插入数据的方法,其中执行sql语句的调用方法都是一样的
- (void)insert{
NSString *sqlString = @"insert into Person (name,age) values ('张三';18)";
char *error = nil;
sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);
if (error == nil) 。。。
- 更新数据的方法
- (void)update{
NSString *sqlString = @"update Person set 'name' = '李四' where id = 1";
char *error = nil;
sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);
if (error == nil) ...
}
- 删除数据的方法
- (void)deleteDate{
NSString *sqlString = @"delete from Person where id = 1";
char *error = nil;
sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);
if (error == nil) ...
}
}
- 查询数据的方法,这里和上面的几个操作不同
- (void)select{
NSString *sqlString = @"select * from Person";
// 准备sql语句
// 第三个参数是sql语句的长度,如果写入sqlString.length会报个警告类型不匹配,我们可以写个-1,这样系统会自动计算长度,第三个参数需要传入一个sql的语句管理者指针,最后一个参数是预留参数
sqlite3_stmt *stmt = nil;
sqlite3_prepare(ppDb, sqlString.UTF8String, -, &stmt, nil);
// 单步执行语句
// 判断如果有数据,就执行语句
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 根据数据类型获取数据,第一个参数是语句管理者,第二个参数是第几列
int ID = sqlite3_column_int(stmt, );
const unsigned char *nameText = sqlite3_column_text(stmt, );
// 把获取到的C语言的字符串转成OC的字符串
NSString *name = [NSString stringWithUTF8String:(const char *)nameText];
int age = sqlite3_column_int(stmt, );
NSLog(@"ID=%d,name=%@,age=%d",ID,name,age);
}
// 释放sql语句管理者
sqlite3_finalize(stmt);
}