(一)FMDB的使用
(本篇参考了唐巧的这篇博客在iOS开发中使用FMDB和他放在Github的源代码FmdbSample,以及FMDB的Github项目说明文档ccgus/fmdb。)
FMDB邮件列表
阅读SQLite FAQ
SQLite Frequently Asked Questions
不要忘了把SQLite文档也加入书签:SQLite Documentation
CocoaPods
FMDB 可以用CocoaPods来管理。
pod 'FMDB'
# pod 'FMDB/FTS' # FMDB with FTS
# pod 'FMDB/standalone' # FMDB with latest SQLite amalgamation source
# pod 'FMDB/standalone/FTS' # FMDB with latest SQLite amalgamation source and FTS
# pod 'FMDB/SQLCipher' # FMDB with SQLCipher
FMDB类详解
ARC还是手动内存管理?
FMDB同时兼容ARC和非ARC工程,它会在编译期获知你的内存管理方式,然后do the right thing。
用法
FMDB有三个主要的类:
FMDatabase - 代表了一个SQLite数据库,它被用来执行SQL语句。
FMResultSet - FMDatabase执行query语句之后返回的结果集。
FMDatabaseQueue - 如果想在多线程中执行query和update,你应该使用这个类。
引入相关文件
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMDatabasePool.h
FMDatabasePool.m
FMDatabaseQueue.h
FMDatabaseQueue.m
FMResultSet.h
FMResultSet.m
创建数据库
使用SQLites数据库文件的路径来创建数据库。当该文件不存在时,fmdb会自己创建一个;如果你传入的参数是空串:@“” ,则fmdb会在临时文件目录下创建这个数据库;如果你传入的参数是 NULL,则它会建立一个在内存中的数据库。
FMDatabase*db=[FMDatabasedatabaseWithPath:@"/tmp/tmp.db"];
打开数据库
如果权限不足或者资源不足则会打开失败。
if (![dbopen])
{
[dbrelease];
return;
}
执行更新操作
除SELECT以外的其他操作都是更新操作,包括CREATE、UPDATE、INSERT、ALTER、COMMIT、BEGIN、DETACH、DELETE、DROP、END、EXPLAIN、VACUUM、REPLACE。
[db executeUpdate:sql];
返回值为BOOL类型。若返回false则说明发生了错误,可以调用lastErrorMessage和lastErrorCode方法以查看错误信息。
执行SELECT操作
FMResultSet *rs = [db executeQuery:@"SELECT * FROM user"];
while ([rs next]) {
NSString* name = [rs stringForColumn:@"name"];
NSString* pass = [rs stringForColumn:@"password"];
}
FMDB提供如下多个方法来获取不同类型的数据:
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
上述每一个方法都对应着一个{type}ForColumnIndex:方法,该方法通过列的索引来获取数据,与通过列名获取数据效果一样。
NSString* name = [rs stringForColumnIndex:0];
另外,不必关闭FMResultSet。因为它会随着FMResultSet被回收或者数据库被关闭而自动关闭。
关闭数据库
当完成查询和更新操作后应该关闭数据库。
[db close];
执行多个SQL语句
可以使用FMDatabase的executeStatements: withResultBlock:方法执行多个SQL语句。
NSString*sql =@"create table bulktest1 (id integer primary key autoincrement, x text);"
"create table bulktest2 (id integer primary key autoincrement, y text);"
"create table bulktest3 (id integer primary key autoincrement, z text);"
"insert into bulktest1 (x) values ('XXX');"
"insert into bulktest2 (y) values ('YYY');"
"insert into bulktest3 (z) values ('ZZZ');";
success = [dbexecuteStatements:sql];
sql =@"select count(*) as count from bulktest1;"
"select count(*) as count from bulktest2;"
"select count(*) as count from bulktest3;";
success = [self.db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary) {
NSIntegercount = [dictionary[@"count"] integerValue];
XCTAssertEqual(count,1,@"expected one record for dictionary%@", dictionary);
return0;
}];
数据参数
通常情况下,你可以按照标准的SQL语句,用?表示执行语句的参数,然后,可以我们可以调用executeUpdate方法来将?所指代的具体参数传入,通常是用变长参数来传递进去的,如下:
NSString * sql=@"insert into User (name, password) values (?, ?)";
[db executeUpdate:sql,user.name,user.password];
这里需要注意的是,参数必须是NSObject的子类,所以象int,double,bool这种基本类型,需要封装成对应的包装类才行。
线程安全
不要在多线程中初始化和使用FMDatabase的实例。取而代之的是,你应该使用FMDatabaseQueue。用法如下:
FMDatabaseQueue *queue = [FMDatabaseQueuedatabaseQueueWithPath:aPath];
[queueinDatabase:^(FMDatabase *db) { [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:1]]; [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:2]]; [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:3]]; FMResultSet *rs = [dbexecuteQuery:@"select * from foo"];while([rsnext]) { … }}];
FMDatabaseQueue中事务:
[queueinTransaction:^(FMDatabase *db,BOOL*rollback) { [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:1]]; [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:2]]; [dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:3]];if(whoopsSomethingWrongHappened) { *rollback =YES;return; }// etc…[dbexecuteUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumbernumberWithInt:4]];}];
(二)在命令行下查看sqlite文件
唐巧先生在他的博客中提到了一个图形化界面的工具,是Firefox的一个名为SQLite Manager的插件。
我想说的是如何在命令行下查看sqlite数据库的内容。
首先使用cd命令进入sqlite所在的目录(我的文件是在沙盒中的Documents文件夹中):
使用sqlite3命令打开数据库文件:
使用“.tables”命令可以查看改数据库中有多少个表:
使用“.schema”命令可以查看表的模式,如图所示:
最后使用select语句查看内容(千万记得select语句最后要加分号):
其他功能大家可以自己使用“.help”命令查看。
网友评论