@end
打印查看结果:
提示:
如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是从0开始,而是接着之前的ID进行编号。
注意:
不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。
七、FMDB数据库队列
1.代码示例
(1).需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。
(2).代码如下:
//
// YYViewController.m
// 05-FMDB数据库队列
//
// Created by apple on 14-7-28.
// Copyright (c) 2014年 wendingding. All rights reserved.
//
#import "YYViewController.h"
#import "FMDB.h"
@interface YYViewController ()
@property(nonatomic,strong)FMDatabaseQueue *queue;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//1.获得数据库文件的路径
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];
//2.获得数据库队列
FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName];
// FMDatabase *db=[FMDatabase databaseWithPath:fileName];
//3.打开数据库
[queue inDatabase:^(FMDatabase *db) {
BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
if (result) {
NSLog(@"创表成功");
}else
{
NSLog(@"创表失败");
}
}];
self.queue=queue;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//插入数据
// [self.queue inDatabase:^(FMDatabase *db) {
// [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
// }];
//查询数据
[self.queue inDatabase:^(FMDatabase *db) {
// 1.执行查询语句
FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"];
// 2.遍历结果
while ([resultSet next]) {
int ID = [resultSet intForColumn:@"id"];
NSString *name = [resultSet stringForColumn:@"name"];
int age = [resultSet intForColumn:@"age"];
NSLog(@"%d %@ %d", ID, name, age);
}
}];
}
@end
先插入数据,之后查询结果,打印如下:
(3).代码说明
有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
2.事务
事务,没有事务的话会出现问题。
举例:银行的例子
张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。
事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。
事务代码处理:
把多条语句添加到一个事务中去执行:
//插入数据
[self.queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
[db commit];
}];
如果中途出现问题,那么会自动回滚,也可以选择手动回滚。
//插入数据
[self.queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
[db rollback];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
[db commit];
}];
上面的代码。前三条插入语句是作废的。
事务处理的另一种方式:
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
[db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
}];
说明:先开事务,再开始事务,之后执行block中的代码段,最后提交事务。
标签:SQLite
相关阅读 >>
Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程
php轻量级数据库操作类medoo增加、删除、修改、查询例子
使用sql语句统计数据时sum和count函数中使用if判断条件的讲解
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
相关推荐
评论
管理员已关闭评论功能...
- 欢迎访问木庄网络博客
- 可复制:代码框内的文字。
- 方法:Ctrl+C。