FMDB的用法以及在命令行下查看sqlite文件 【New】

【这只不过整理了一下之前那一篇的格式,内容是一样的,只不过这是用markdown写的。我刚开始用markdown,这也算是对markdown的一次练习。】

(一)FMDB的使用

(本篇参考了唐巧先生的这篇博客在iOS开发中使用FMDB和他放在Github的源代码FmdbSample,以及FMDB的Github项目说明文档ccgus/fmdb,主要目的是整理自己的知识点)

(1)安装

可以通过CocoaPods来导入FMDB。

pod 'FMDB'

(2)FMDB类详解

想要查看FMDB各个类的功能和用法,请点击这里。当然我觉得还是把文件导入到项目里然后直接看源码就行了。

(3)使用ARC还是手动管理内存

FMDB同时兼容ARC非ARC工程,它会在编译期获知你的内存管理方式,然后自动帮你处理内存管理这些事。

(4)FMDB主要用到的三个类

  • FMDatabase --- 代表了一个SQLite数据库,它被用来执行SQL语句。
  • FMResultSet --- FMDatabase执行query语句之后返回的结果集。
  • FMDatabaseQueue --- 如果想在多线程中执行queryupdate,你应该使用这个类。

(5)引入相关文件

FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMDatabasePool.h
FMDatabasePool.m
FMDatabaseQueue.h
FMDatabaseQueue.m
FMResultSet.h
FMResultSet.m

(6)创建数据库

使用SQLites数据库文件的路径来创建数据库。当该文件不存在时,fmdb会自己创建一个;如果你传入的参数是空串(@""),则fmdb会在临时文件目录下创建这个数据库;如果你传入的参数是NULL,则它会建立一个在内存中的数据库。

FMDatabase * db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];

(7)打开数据库

如果权限不足或者资源不足则会导致打开失败。

if (![db open]) {
    [db release];
    return;
}

(8)执行更新操作

SELECT以外的其他操作都是更新操作,包括CREATEUPDATEINSERTALTERCOMMITBEGINDETACHDELETEDROPENDEXPLAINVACUUMREPLACE

NSString * sql = @"insert into user (name, password) values(?, ?) ";
BOOL res = [db executeUpdate:sql, @"hello", @"123"];

返回值为BOOL类型。若返回false则说明发生了错误,可以调用lastErrorMessagelastErrorCode方法以查看错误信息。

(9)执行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被回收或者数据库被关闭而自动关闭。

(10)关闭数据库

当完成查询和更新操作后应该关闭数据库。

[db close];

(11)执行多个SQL语句

可以使用FMDatabaseexecuteStatements: 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 = [db executeStatements: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) {
    NSInteger count = [dictionary[@"count"] integerValue];
    XCTAssertEqual(count, 1, @"expected one record for dictionary %@", dictionary);
    return 0;
}];

(12)数据参数

通常情况下,你可以按照标准的SQL语句,用?表示执行语句的参数,然后,可以我们可以调用executeUpdate方法来将?所指代的具体参数传入,通常是用变长参数来传递进去的,如下:

NSString * sql = @"insert into User (name, password) values (?, ?)";
[db executeUpdate:sql, user.name, user.password];

这里需要注意的是,参数必须是NSObject的子类,所以象int,double,bool这种基本类型,需要封装成对应的包装类才行。

(13)线程安全

不要在多线程中初始化和使用FMDatabase的实例。取而代之的是,你应该使用FMDatabaseQueue。用法如下:

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }
}];

FMDatabaseQueue中事务:

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    if (whoopsSomethingWrongHappened) {
        *rollback = YES;
        return;
    }
    // etc…
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
}];

(二)在命令行下查看sqlite文件

唐巧先生在他的博客中提到了一个图形化界面的工具,是Firefox的一个名为SQLite Manager的插件。
我想说的是如何在命令行下查看sqlite数据库的内容。

首先使用cd命令进入sqlite所在的目录(我的文件是在沙盒中的Documents文件夹中):

FMDB的用法以及在命令行下查看sqlite文件 【New】_第1张图片
文件目录位置

进入目录

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

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

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

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

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

你可能感兴趣的:(FMDB的用法以及在命令行下查看sqlite文件 【New】)