表 (table)
记录(row)
字段(column)
NULL: 表示该值为NULL值
INTEGER: 无符号整型值
REAL: 浮点值
TEXT: 文本字符串
BLOB: 二进制数据(比如文件)
sqlite3基本语句:
(1)增:insert into 表名(字段1,字段2。。。。)values(字段1的值,字段2的值。。。。);
例如:INSERT INTO user(name, age) VALUES ('%@', %zd)
(2)删:delete from 表名 条件;//若没条件则会删除整个表里所有的记录
例如:delete from user where id = %zd
(3)改:update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值,。。。。。条件;//若没条件则会讲整个表相对应得字段全部更新
例如:update user set name = '%@', age = %zd where id = %zd
(4)查:select * from 表名;
select * from 表名 order by 字段
例子:查询所有数据:select * from user
查询所有数据,根据年龄降序查询:select * from user order by age desc//升序只需把desc改成asc;若有多个条件,及优先级从左往右依次降低
where用法:
where 字段 = 某个值and字段 > 某个值; //and相当于&&
where 字段 = 某个值 or 字段 = 某个值; //or相当于 ||
例如1:where age = 10 and name = 'ljl';
例如2:where age > 10 and age <20;
例如3:where age > 10 or name != 'ljl';
本地数据库实例:
//=======================ViewController.h===================
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
//=======================ViewController.m==================
#import "ViewController.h"
#import "sqlite3Controller.h"
@interface ViewController ()
@property (nonatomic, strong)sqlite3Controller *sqlite;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIButton *btnCreatDB = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnCreatDB.frame = CGRectMake(110, 100, 100, 30);
[btnCreatDB setTitle:@"创建数据库"forState:UIControlStateNormal];
[btnCreatDB addTarget:self action:@selector(btnCreatDB) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnCreatDB];
UIButton *btnCreatTable = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnCreatTable.frame = CGRectMake(110, 150, 100, 30);
[btnCreatTable setTitle:@"创建数据表"forState:UIControlStateNormal];
[btnCreatTable addTarget:self action:@selector(btnCreatTable) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnCreatTable];
UIButton *btnInsert = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnInsert.frame = CGRectMake(110,200, 100, 30);
[btnInsert setTitle:@"插入记录"forState:UIControlStateNormal];
[btnInsert addTarget:self action:@selector(btnInsert) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnInsert];
UIButton *btnSelect = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnSelect.frame = CGRectMake(110, 250, 100, 30);
[btnSelect setTitle:@"查询记录"forState:UIControlStateNormal];
[btnSelect addTarget:self action:@selector(btnSelect) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnSelect];
UIButton *btnAlert = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnAlert.frame = CGRectMake(110, 300, 100, 30);
[btnAlert setTitle:@"修改记录"forState:UIControlStateNormal];
[btnAlert addTarget:self action:@selector(btnAlert) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnAlert];
UIButton *btnRemove = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnRemove.frame = CGRectMake(110, 350, 100, 30);
[btnRemove setTitle:@"删除记录"forState:UIControlStateNormal];
[btnRemove addTarget:self action:@selector(btnRemove) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnRemove];
UIButton *btnRemoveTable = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnRemoveTable.frame = CGRectMake(110, 400, 100, 30);
[btnRemoveTable setTitle:@"删除表"forState:UIControlStateNormal];
[btnRemoveTable addTarget:self action:@selector(btnRemoveTable) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnRemoveTable];
}
-(void)btnAlert
{
Person *person = [Person personWithName:@"ljl" andAge:20];
person.ID = 2;
[self.sqlite alertDB:person];
}
-(void)btnCreatDB
{
self.sqlite = [sqlite3Controller getInstance];
[self.sqlite openDB];
}
-(void)btnInsert
{
int i = arc4random_uniform(18)+10;
NSString *name = [NSString stringWithFormat:@"江龙%d",i];
Person *p = [Person personWithName:name andAge:i];
[self.sqlite addPerson:p];
}
-(void)btnCreatTable
{
[self.sqlite creatDB];
}
-(void)btnSelect
{
[self.sqlite selectAllPerson];
// NSArray *arr = [self.sqlite selectAllPerson];
// NSLog(@"arr = %@",arr);
}
-(void)btnRemove
{
[self.sqlite remove:2];
}
-(void)btnRemoveTable
{
[self.sqlite removeTable];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//==================================Person.h================================
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, assign) NSInteger ID;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
+ (id)personWithName:(NSString *) name andAge:(NSInteger)age;
//==================================Person.m===============================
#import "Person.h"
@implementation Person
+(id)personWithName:(NSString *)name
andAge:(NSInteger)age
{
Person *p = [[Person alloc]init];
p.name = name;
p.age = age;
return p;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"person:%p ID:%zd name:%@ age:%zd", self, self.ID, self.name, self.age];
}
@end
//==================================sqlite3Controller.h============================
#import <UIKit/UIKit.h>
#import <sqlite3.h>
#import "Person.h"
@interface sqlite3Controller : UIViewController
{
sqlite3 *db;
}
+(sqlite3Controller *)getInstance;
-(void)openDB;
-(void)creatDB;
-(void)addPerson:(Person *)person;
-(void)sqlExec:(NSString *)sql andDescription:(NSString *)description;
-(void)remove:(NSInteger)ID;
-(void)removeTable;
-(void)alertDB:(Person *)person;
-(NSArray *)selectAllPerson;
@end
@end
//=============================sqlite3Controller.m============================
#import "sqlite3Controller.h"
#import "Person.h"
@interface sqlite3Controller ()
@end
@implementation sqlite3Controller
/**
* 实现单例
*/
static sqlite3Controller *instance = nil;
+(sqlite3Controller *)getInstance
{
if (instance == nil) {
instance = [[sqlite3Controller alloc]init];
}
return instance;
}
+(id)allocWithZone:(struct _NSZone *)zone
{
if (instance == nil) {
instance = [super allocWithZone:zone];
}
return instance;
}
/**
* 初始化时便新建打开数据库
*
*/
-(id)init
{
if ([super init]) {
[self openDB];
[self creatDB];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor redColor]];
// Do any additional setup after loading the view.
// //打开数据库
// [self openDB];
// //创建数据库
// [self creatDB];
}
#pragma mark - 创建/打开数据库
-(void)openDB
{
NSString *dock = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *dbName =[dock stringByAppendingPathComponent:@"first.db"];
NSLog(@"%@",dock);
// db = NULL;
if (sqlite3_open(dbName.UTF8String, &db) == SQLITE_OK) {
NSLog(@"创建/打开数据库成功");
}else
{
NSLog(@"创建/打开数据库失败 ");
}
}
#pragma mark -创建数据表
-(void)creatDB
{
NSString *sql = @"CREATE TABLE IF NOT EXISTS user(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER )";
[self sqlExec:sql andDescription:@"创建表"];
}
#pragma mark -单步执行
-(void)sqlExec:(NSString *)sql andDescription:(NSString *)description
{
char *errmsg;
if (SQLITE_OK == sqlite3_exec(db, sql.UTF8String, nil, nil, &errmsg)) {
NSLog(@"%@成功", description);
}else
{
NSLog(@"%@失败", description);
}
}
#pragma mark -添加记录
-(void)addPerson:(Person *)person
{
NSString *sql = [NSString stringWithFormat:@"INSERT INTO user(name, age) VALUES ('%@', %zd)",person.name,person.age];
[self sqlExec:sql andDescription:@"添加记录"];
// sqlite3_close(db);
}
#pragma mark -查询记录
-(NSArray *)selectAllPerson{
NSString *sql = @"select * from";
//设置一个句柄
sqlite3_stmt *stmt;
//声明一个数组,在判断查询语句成功后初始化
NSMutableArray *allPersons = nil;
//评估sql语句语法是否正确
if (SQLITE_OK == sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL)) {
//查询语句正确后进行初始化数组
allPersons = [NSMutableArray array];
//单步执行方法,依次取得结果
while(SQLITE_ROW == sqlite3_step(stmt)) {
int ID = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
NSString *nameUTF8 = [NSString stringWithUTF8String:(const char *)name];
// NSLog(@"id = %d\n name = %@\n age = %d",ID, nameUTF8,age);
Person *p = [Person personWithName:nameUTF8 andAge:age];
p.ID = ID;
[allPersons addObject:p];
}
}else {
NSLog(@"sql语法错误");
}
NSLog(@"allPersons = %@", allPersons);
return allPersons;
}
#pragma mark -修改个人记录
-(void)alertDB:(Person *)person
{
NSString *sql = [NSString stringWithFormat:@"update user set name = '%@', age = %zd where id = %zd", person.name, person.age, person.ID];
[self sqlExec:sql andDescription:@"更新数据"];
[self selectAllPerson];
}
#pragma mark -删除个人记录
-(void)remove:(NSInteger)ID
{
NSString *sql = [NSString stringWithFormat:@"delete from user where id = %zd",ID];
[self sqlExec:sql andDescription:@"删除数据"];
}
#pragma mark -删除表
-(void)removeTable{
NSString *sql = @"drop table user";
char *errmsg;
if (SQLITE_OK == sqlite3_exec(db, sql.UTF8String, nil, nil, &errmsg)) {
NSLog(@"删除数据库成功!");
}else
{
NSLog(@"删除数据库失败!");
}
}
@end