美文网首页iOS 数据库
FMDB使用以及在命令行下查看sqlite文件

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

作者: a5da958858b8 | 来源:发表于2015-08-28 10:57 被阅读1484次

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

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

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

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

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

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

    相关文章

      网友评论

      本文标题:FMDB使用以及在命令行下查看sqlite文件

      本文链接:https://www.haomeiwen.com/subject/ctphcttx.html