一、sqlite基本语法
Sqlite满足SQL的基本语法,但是有一些语法会有不同或者不支持。比如外连接命令、视图都是不支持的,但是最基本的使用还是支持的,比如我们项目中需要的select,insert,delete等等。
Sqlite的数据类型一共有5种,NULL、INTEGER 、REAL 、TEXT 、BLOB,其他的数据类型在储存时都转化为这五种之一。同时SQLite使用的是动态类型,会根据储存的值自动判断类型。
二、FMDatabase——sqlite API的objective-c封装
FMDB是网上的一个开源项目,遵循MIT协议,主页在https://github.com/ccgus/fmdb 。这个开源框架就是将sqlite底层的c接口封装成objective-c的接口,方便我们使用。
我在网上查阅关于objective-c中的sqlite的资料的时候很多人都提到了这个框架,他大大简化了在objective-c中使用sqlite的方法。这个框架主要有这样两个类:
FMDatabase : 表示一个单独的SQLite数据库,用于执行查询
FMResultSet : 用于表示查询结果
在FMDatabase中提供了操作数据库的基本方法,下面讲一下我们需要经常用到的几种方法:
1.建立数据库:FMDatabase *db =[ FMDatabase databaseWithPath:@"/tmp/tmp.db"]
建立数据库有三种参数:
l 直接给出路径,如果文件不存在系统会为你创建;
l 给一个空字符串@"",系统会在硬盘创建一个临时文件,当数据库关闭时删除;
l NULL 这是会在内存中建立一个数据库。
2.打开数据库操作
注意打开失败时需要释放资源 否则可能内存泄漏。
if(![db open]){
[db release];
return;
}
3.修改操作:
系统最推荐的函数为
- ( BOOL ) executeUpdate: (NSString*) sql, ...;
- ( BOOL ) executeUpdate: (NSString*) sql withArgumentsInArray: (NSArray *) arguments;
这两个函数返回的是操作成功或者失败的信息。其中sql就是一个储存sql语句的字符串变量,比如插入操作可以这样写:
[FmDb executeUpdate:@"insert into table values (?)",@"test" ];
这里问号是一个占位符,关于这个我会在后面详细解释。
在这里可以通过 -lastErrorMessage 和 - lastErrorCode 定位上次的错误。
4.查询操作
查询操作一般指以select开头的操作,他们通常返回一个FMResultSet的对象,储存着此次查询的结果。
系统推荐使用函数为:
- ( FMResultSet *) executeQuery:(NSString*) sql, ...;
- ( FMResultSet *) executeQuery:(NSString* ) sql, withArgumentsInArray: (NSArray *) arguments;
函数在成功是会返回一个FMResultSet,失败会返回nil.
一般情况下,我们使用next操作来遍历整个查询:
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
//retrieve values for each record
}
5.查询语句
上文曾经说过SQLite使用?作为占位符,如INSERT INTO myTable VALUES (?, ?, ?),系统推荐我们给占位符传递参数来驱动操作,而不推荐使用%d的%@的方式。
因此我们写查询时应该这样:
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has \" lots of ' bizarre \" quotes '"];
而不应该这样:
[db executeUpdate:[NSString stringWithFormat:@"INSERT INTO myTable VALUES (%@)", @"this has \" lots of ' bizarre \" quotes '"]];
同时由于给?传递的参数必须是对象,如果有数字时要转换成NSNumber。
6.数据库收缩
数据库收缩是一个很常用的命令,sqlite执行数据库收缩的命令是vacuum。通过这个命令可以手动收缩数据库。当然我们也可以命令表自动收缩,只要在建表后执行以下命令:
m_db.execDML(_T("PRAGMA auto_vacuum = 1"));//(m_db为CppSQLite3DB对象)
但是自动收缩只是将空闲页除去,不会整理或压缩数据库页,所以效果并不理想。在项目中我们还是应该采用vacuum命令手动收缩数据库。
最近评论