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 输出: 保留参数
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];
}];