UI基础整理-20
2016-01-23 09:13
274 查看
第二十节:sqlite
创建单例对象(数据库只需要一个就可以,所以创建单例对象)
// SHDBManager.h
#import
<Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface
SHDBManager : NSObject<NSCopying,NSMutableCopying>
/**
* 创建单例的静态方法
*
* @return
返回单例对象
*/
static SHDBManager *manager = nil;
//因为数据库的打开和关闭都是一个,所以写成全局的
static sqlite3 *db = nil;
+ (instancetype)shareManager ;
创建单例的时候需要写线程保护
staticdispatch_once_t
onceToken;
dispatch_once(&onceToken, ^{
//这里面的代码只会运行一次
manager
= [selfnew];
});
这里还需要完善单例
重写alloc和init方法
//重写alloc方法
+ (instancetype)allocWithZone:(struct_NSZone
*)zone{
// @synchronized保护对象在多线程的情况下同时只有一个线程来访问
@synchronized(manager) {
if (!manager) {
//父类指针指向子类对象
manager = [superallocWithZone:zone];
}
return
manager;
}
}
- (instancetype)init{
@synchronized(self) {//这里self和manager是一样的(实例对象)
self = [superinit];//这里不写if(),因为上面alloc就已经将对象创建好了
return self;
}
}//new是alloc和
init的结合
解决copy问题(需要遵循协议)
在外界进行copy或mutablecopy时返回自己
- (id)copyWithZone:(NSZone*)zone{
return
self;
}
- (id)mutableCopyWithZone:(NSZone*)zone{
return
self;
}
- (id)copy{
return
self;
}
- (id)mutableCopy{
return
self;
}
数据库操作:
1.打开数据库(有就打开数据库,没有就创建数据库)
int result = sqlite3_open(path.UTF8String,&db);
2.关闭数据库(所有的操作都是在关闭数据前操作的)
int result = sqlite3_close(db);
3.创建表
SQL语句:
NSString sqlWord = @"create table if not exists 's_student' ('number' integer primary key autoincrement not null unique,'name' text not null,'age'
integer default 18,'gender' text default 男,'score' real not null)";"
执行SQL语句:
int result = sqlite3_exec(db,sqlword.UTF8String);
4.增
SQL语句:
[NSString stringWithFormat:@"insert into s_student values(%lu,'%@',%lu,'%@',%lf)",number,name,age,gender,score];
执行语句:
sqlite3_exec(db,sqlWord.UTF8String,NULL,NULL,NULL)
5.删
SQL语句:
delegate from s_student number = 1
执行语句同增加
6.改
SQL语句:
update s_student set name = @"张三" where number = 1
执行语句同删
7.查(※)
sqlite数据库常用SQL语句
创建表
CREATE TABLE IF NOT EXISTS "student" ("number" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" TEXT NOT NULL, "age" INTEGER NOT NULL, "gender" TEXT DEFAULT M);
创建一个表,如果不存在才创建(IF NOT EXISTS),表名是Student 字段有number(数字,主键,自增,不能为空),name(文本,不能为空),age(数字,不能为空),gender(文本,默认值M)
增
第一种,整体添加
INSERT INTO student VALUES (3,’宋立龙’,19,’M’)
向student表中添加数据,数据的值先后顺序要和已有的字段一一对应,且不可缺少
第二种,部分添加
INSERT INTO student (name,age,gender) VALUES (‘宋立龙’,30,'M')
向student表中添加数据,字段和值对应
删
第一种,整体删除
DELETE FROM student
第二种,根据条件删除
DELETE FROM student WHERE number = 1
改
第一种,整体修改
UPDATE student SET age = 20
第二种,条件修改
UPDATE student SET age = 20 WHERE name = 'lisi'
查
第一种,查询全部
SELECT * FROM student
第二种,条件查询
SELECT *FROM student WHERE name = 'lisi'
创建单例对象(数据库只需要一个就可以,所以创建单例对象)
// SHDBManager.h
#import
<Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface
SHDBManager : NSObject<NSCopying,NSMutableCopying>
/**
* 创建单例的静态方法
*
* @return
返回单例对象
*/
static SHDBManager *manager = nil;
//因为数据库的打开和关闭都是一个,所以写成全局的
static sqlite3 *db = nil;
+ (instancetype)shareManager ;
创建单例的时候需要写线程保护
staticdispatch_once_t
onceToken;
dispatch_once(&onceToken, ^{
//这里面的代码只会运行一次
manager
= [selfnew];
});
这里还需要完善单例
重写alloc和init方法
//重写alloc方法
+ (instancetype)allocWithZone:(struct_NSZone
*)zone{
// @synchronized保护对象在多线程的情况下同时只有一个线程来访问
@synchronized(manager) {
if (!manager) {
//父类指针指向子类对象
manager = [superallocWithZone:zone];
}
return
manager;
}
}
- (instancetype)init{
@synchronized(self) {//这里self和manager是一样的(实例对象)
self = [superinit];//这里不写if(),因为上面alloc就已经将对象创建好了
return self;
}
}//new是alloc和
init的结合
解决copy问题(需要遵循协议)
在外界进行copy或mutablecopy时返回自己
- (id)copyWithZone:(NSZone*)zone{
return
self;
}
- (id)mutableCopyWithZone:(NSZone*)zone{
return
self;
}
- (id)copy{
return
self;
}
- (id)mutableCopy{
return
self;
}
数据库操作:
1.打开数据库(有就打开数据库,没有就创建数据库)
int result = sqlite3_open(path.UTF8String,&db);
2.关闭数据库(所有的操作都是在关闭数据前操作的)
int result = sqlite3_close(db);
3.创建表
SQL语句:
NSString sqlWord = @"create table if not exists 's_student' ('number' integer primary key autoincrement not null unique,'name' text not null,'age'
integer default 18,'gender' text default 男,'score' real not null)";"
执行SQL语句:
int result = sqlite3_exec(db,sqlword.UTF8String);
4.增
SQL语句:
[NSString stringWithFormat:@"insert into s_student values(%lu,'%@',%lu,'%@',%lf)",number,name,age,gender,score];
执行语句:
sqlite3_exec(db,sqlWord.UTF8String,NULL,NULL,NULL)
5.删
SQL语句:
delegate from s_student number = 1
执行语句同增加
6.改
SQL语句:
update s_student set name = @"张三" where number = 1
执行语句同删
7.查(※)
sqlite数据库常用SQL语句
创建表
CREATE TABLE IF NOT EXISTS "student" ("number" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" TEXT NOT NULL, "age" INTEGER NOT NULL, "gender" TEXT DEFAULT M);
创建一个表,如果不存在才创建(IF NOT EXISTS),表名是Student 字段有number(数字,主键,自增,不能为空),name(文本,不能为空),age(数字,不能为空),gender(文本,默认值M)
增
第一种,整体添加
INSERT INTO student VALUES (3,’宋立龙’,19,’M’)
向student表中添加数据,数据的值先后顺序要和已有的字段一一对应,且不可缺少
第二种,部分添加
INSERT INTO student (name,age,gender) VALUES (‘宋立龙’,30,'M')
向student表中添加数据,字段和值对应
删
第一种,整体删除
DELETE FROM student
第二种,根据条件删除
DELETE FROM student WHERE number = 1
改
第一种,整体修改
UPDATE student SET age = 20
第二种,条件修改
UPDATE student SET age = 20 WHERE name = 'lisi'
查
第一种,查询全部
SELECT * FROM student
第二种,条件查询
SELECT *FROM student WHERE name = 'lisi'
相关文章推荐
- Gradle构建控制Log开关——BuildConfig\自定义
- **LeetCode 60. Permutation Sequence
- 简单的购物车UI界面
- 为实现真正的点击空白收起键盘,让UITableView响应touch事件
- UGUI屏蔽Ray检测
- 关于EL表达式中requestScope和param区别
- UITableView
- IOS_改变UITextField placeHolder颜色、字体
- UITextField详解之一:UITextField基本属性
- Gson 2 --GsonBuilder
- 使用UITextView的问题及自定义UITextView
- String、StringBuffer和StringBuilder类
- UINavigationItem UINavigationBar 关系分析
- 添加UIview自定义的分割线、去掉默认的cell分割线、默认选中某一个(行)cell的方法
- 第六天,UITableView,和cell的基础介绍
- iOS(学习3) UITextField 常用属性
- sequelize常见操作使用方法(增删改查,手把手教学)
- Easyui Datagrid自己创建一个编辑器
- Arduino串口读取夏普GP2Y1051
- UICollectionView