1、
通过Sqlite创建数据库。首先导入框架;
//创建数据库的路径;
NSString
*path = [[
NSSearchPathForDirectoriesInDomains
(
NSDocumentDirectory
,
NSUserDomainMask
,
YES
)
lastObject
]
stringByAppendingPathComponent
:
@"data.sqlite"
];
//第一个参数是C类型的字符创。表示路径;第二个参数表示数据库的地址;是 sqlite3 类型,返回的参数可以做为是否创建成功的依据;
int success = sqlite3_open(path.UTF8String, &_db);
//创建表:使用create关键字。非查询语句都使用这个函数
sqlite3_exec
;
if (success == SQLITE_OK) {
//创建表;加上条件判断 if not exists;如果不存就创建; 不加有可能会报错;
//表table:在创建的时候,一定要设置primary key(主键),并且主键不能频繁更改,且与数据无关;
NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL , score REAL DEFAULT 60.0);";
int
successT =
sqlite3_exec
(
_db
, sql.
UTF8String
,
NULL
,
NULL
,
NULL
);
}
//增加数据:使用insert 关键字;
NSString
*sql = [
NSString
stringWithFormat
:
@"INSERT INTO t_student (name,score) VALUES ('%@',%f);"
,name,
arc4random_uniform
(8000)/100.0 + 20];
int success = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);
//删除数据:使用delete 关键字;where 是设置条件;这里是 score > 90 的删除;
NSString *sql = @"DELETE FROM t_student WHERE score > 90.0;";
int success = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);
//更新/修改数据:使用update 和 set 关键字;
NSString *sql = @"UPDATE t_student SET score = 59.9 WHERE score < 60;";
int success = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);
//查询数据:使用 select 关键字, Like是模糊查询,% 是通配符,这里是查询名字里包含 8 这个字符的学生;
NSString *sql = @"SELECT id,name,score FROM t_student WHERE name LIKE '%8%'";
//
期望
结果保存在
stmt
里面
sqlite3_stmt *stmt = nil;
//
准备查询
其实
把查询结果保存在
stmt
指针区域中
/*参数的含义:
sqlite3 *db, 数据库的句柄
const char *zSql, sql语句
int nByte, sql语句的最大长度 -1代表无限制;
sqlite3_stmt **ppStmt, 输出: Statement 句柄 获取最终的结果数据
const char **pzTail 输出: 保留参数
*/
int success = sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stmt, NULL);
if (success == SQLITE_OK) {
//
一步步获取每一条
step
拿一条数据
SQLITE_ROW
证明成功拿到数据
while
(
sqlite3_step
(stmt) ==
SQLITE_ROW
) {
// id 0 name 1 score 2 获取一行中每一列的数据;
const
char
*name = (
const
char
*)
sqlite3_column_text
(stmt, 1);
double
score =
sqlite3_column_double
(stmt, 2);
NSLog
(
@"
姓名
:%@
成绩
:%f"
,[
NSString
stringWithUTF8String
:name],score);
}
}
1、FMDB数据库的创建,
FMDB 是对于sqlite的一个封装;是基于对象的;
NSString
*path = [[
NSSearchPathForDirectoriesInDomains
(
NSDocumentDirectory
,
NSUserDomainMask
,
YES
)
lastObject
]
stringByAppendingPathComponent
:
@"datafmdb.sqlite"
];
FMDatabase *database = [FMDatabase databaseWithPath:path];
self
.
database
= database;
BOOL success = [database open]; //同过返回值确定是否打开数据库;
2、建表语句,插入,删除,更新都是只用如下方法
:
BOOL successT= [self.database executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL , score REAL);"];
3、查询语句:
//创建sql语句
NSString *sql = @"SELECT id,name,score FROM t_student WHERE score > 60 AND score < 75;";
FMResultSet
*result = [
self
.
database
executeQuery
:sql];
while
([result
next
]) {
//name TEXT
NSString *name = [result stringForColumnIndex:1];
//score DOUBLE
double
score = [result
doubleForColumnIndex
:2];
}
注意:FMDB封装了一套线程安全的数据库;
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"data.sqlite"];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
self
.
queue
= queue;
[
self
.
queue
inDatabase
:^(
FMDatabase
*db) {
//
在
block
内部的就是线程安全,只所有sql语句都写在这个闭包里面;
BOOL success = [db open];
if (success) {
//
非查询语句都是用
executeUpdate
BOOL
successT= [db
executeUpdate
:
@"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL , score REAL);
”];
}
}];
//事务的开启,当一段数据修改需要一起执行。但是执行一部分之后,程序崩溃了或者停电了;剩下的修改语句不能进行。数据就有可能出错;事务就有这样一个功能,被包装成事务的一段代码,要么全部执行,要么都不执行;就可以避免这种情况;
[self.queue inDatabase:^(FMDatabase *db) {
//
开启事务
在这条语句之后的都是一个事务
[db beginTransaction];
//插入需要更新的语句;
//[db rollback]; 这是执行手动回滚;
[db
commit
];
}];