FMDB使用以及在命令行下查看sqlite文件

(一)FMDB的使用

(本篇参考了唐巧的这篇博客在iOS开发中使用FMDB和他放在Github的源代码FmdbSample,以及FMDB的Github项目说明文档ccgus/fmdb。)

FMDB邮件列表

groups.google.com/group/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类详解

FMDB Reference

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文件夹中):

《FMDB使用以及在命令行下查看sqlite文件》
《FMDB使用以及在命令行下查看sqlite文件》

使用sqlite3命令打开数据库文件:

《FMDB使用以及在命令行下查看sqlite文件》

使用“.tables”命令可以查看改数据库中有多少个表:

《FMDB使用以及在命令行下查看sqlite文件》

使用“.schema”命令可以查看表的模式,如图所示:

《FMDB使用以及在命令行下查看sqlite文件》

最后使用select语句查看内容(千万记得select语句最后要加分号):

《FMDB使用以及在命令行下查看sqlite文件》

其他功能大家可以自己使用“.help”命令查看。

    原文作者:Cuinidaye
    原文地址: https://www.jianshu.com/p/9b5273322ddd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞