文档章节

FMDB/SQLCipher数据库管理

我爱觉觉
 我爱觉觉
发布于 2015/10/16 11:03
字数 726
阅读 79
收藏 1
  1. 安装cocopods。http://my.oschina.net/u/2418942/blog/508913。

  2. 安装  pod "FMDB/SQLCipher"。如果安装有问题,可以先对cocopods进行update一下。

  3. 修改FMDatabase文件。添加一个宏定义,修改2个方法。添加的代码用_标出。把带_的代码删除,即可恢复。

#define DB_SECRETKEY @"HPSQLDatabase"

- (BOOL)open {

    if (_db) {

        return YES;

    }

    

    int err = sqlite3_open([self sqlitePath], &_db );

    if(err != SQLITE_OK) {

        NSLog(@"error opening!: %d", err);

        return NO;

    }else if (err == SQLITE_OK)

    {

        [self setKey:DB_SECRETKEY];

    }

    

    if (_maxBusyRetryTimeInterval > 0.0) {

        // set the handler

        [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];

    }

    

    

    return YES;

}

- (BOOL)openWithFlags:(int)flags {

    if (_db) {

        return YES;

    }


    int err = sqlite3_open_v2([self sqlitePath], &_db, flags, NULL /* Name of VFS module to use */);

    if(err != SQLITE_OK) {

        NSLog(@"error opening!: %d", err);

        return NO;

    } else if (err == SQLITE_OK) {

        [self setKey:DB_SECRETKEY];

    }

    

    if (_maxBusyRetryTimeInterval > 0.0) {

        // set the handler

        [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];

    }

    

    return YES;

}


4. 建立sql语句文件。databasefile.sql

CREATE TABLE IF NOT EXISTS "databaseName" (


"did" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,

"name" TEXT,

"createTime" TEXT

)


5. 建立SQLManager文件。SQLiteManager.h和SQLiteManager.m文件

+ (instancetype)sharedSQLiteManager {

    static SQLiteManager* manager;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager = [[SQLiteManager alloc] init];

        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

        path = [path stringByAppendingPathComponent:@"databaseName.db"];

        NSLog(@"SQLitePath ---- %@",path);

        manager.queue = [[FMDatabaseQueue alloc] initWithPath:path];

        [manager creatTable];

    });

    return manager;

}


- (void)creatTable {

        NSString* path = [[NSBundle mainBundle] pathForResource:@"databasefile.sql" ofType:nil];

        NSError* error;

        NSString* statement = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

        if (error != nil) {

            LogE(@"创表字符串错误 ----- %@",error);

        }

        

        [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

            if ([db executeUpdate:statement]) {

                NSLog(@"%@创表成功",sqlStr);

            }else{

                LogE(@"%@创表失败",sqlStr);

                return;

            }

        }];

    }

}


- (void)openDateBase {

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    path = [path stringByAppendingPathComponent:@"databaseName.db"];

    FMDatabase *db =  [FMDatabase databaseWithPath:path];

    if (![db open]) {

        LogE(@"数据库打开失败!");

    }

}


- (void)closeDateBase {

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    path = [path stringByAppendingPathComponent:@"databaseName.db"];

    FMDatabase *db =  [FMDatabase databaseWithPath:path];

    if (![db close]) {

        LogE(@"数据库关闭失败!");

    }

}



// 获取所有信息

- (NSMutableArray *)loadAll {

    [self openDateBase];

    NSString* loadStatement = @"SELECT * FROM databaseName ORDER BY did ASC;";

    NSMutableArray* tempArray = [NSMutableArray array];

    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        FMResultSet* result = [db executeQuery:loadStatement];

        while ([result next]) {

            Detail* detail = [[Detail alloc] init];

            detail.dId = [NSNumber numberWithInt:[result intForColumn:@"did"]];

            detail.name = [result stringForColumn:@"name"];

            detail.createTime = [result stringForColumn:@"createTime"];

            [tempArray detail];

        }

    }];

    [self closeDateBase];

    return tempArray;

}


// 插入数据

- (void)insertData:(Detail*)detail{

    

    [self openDateBase];

    NSString* insertStatement = @"INSERT INTO databaseName (name,createTime) VALUES (?,?);";

    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        if ([db executeUpdate:insertStatement withArgumentsInArray:@[detail.name,getail.createTime]]) {

            NSLog(@"添加成功");

        }else{

            LogE(@"添加失败");

        }

    }];

    [self closeDateBase];

}


// 更新信息

- (void)updatedata:(Detail*)detail{

    NSString* updateStatement = @"UPDATE databaseName SET name = ? WHERE did = ?;";

    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        [db executeUpdate:updateStatement withArgumentsInArray:@[detail.name,detail.dId]];

    }];

}


// 删除

- (void)deleteGroup:(Detail*)detail{

    

    NSString* deleteStatement = [NSString stringWithFormat:@"DELETE FROM databaseName WHERE did = ?;"];

    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        if ([db executeUpdate:deleteStatement withArgumentsInArray:@[detail.dId]]) {

            NSLog(@"删除成功");

        }else {

            NSLog(@"删除失败");

        }

        

    }];

    

}


6. 在viewController调用

#import "SQLiteManager.h"

@property (strong, nonatomic) SQLiteManager *manager;

- (void)viewDidLoad {

    [super viewDidLoad];

    SQLiteManager *manager = [SQLiteManager sharedSQLiteManager];

    self.manager = manager;

然后就可以调用方法了。


7. 在本地文件夹中找到数据库,用Navicat Premium 工具打开,会提示“file is encrypted or is not a database”。这表示你的数据库已经加密了。(如果不做加密的那步骤,在这里是可以用工具打开数据库的)。



8. 提示: 数据库字段名字不能用group

   如果没有加密建立的数据库,想再加密,那么必须把原有数据库删除,不然会报错。

© 著作权归作者所有

共有 人打赏支持
我爱觉觉
粉丝 2
博文 49
码字总数 10640
作品 0
海淀
sqlite3 用SQLCipher 加密后 命令行下如何重新打开和读取

http://sqlcipher.net/sqlcipher-api/#key PRAGMA key The process of creating a new, encrypted database is called “keying” the database. SQLCipher uses just-in-time key derivati......

kjpioo
2013/08/01
0
2
「Android」GreenDao

版本:greenDAO 3.2.2 官网:http://greenrobot.org/greendao/ GitHub:https://github.com/greenrobot/greenDAO 写在前面: 这个库极大的优化了我们使用SQLite数据库,但对SQLite数据库及其语...

为安然
07/30
0
0
使用wxSqlite3来解决sqlite加密问题zz

20141222更新: 最后还是没用wxSQLite3,而是使用了SQLCipher,感觉SQLCipher的文档写得好一些,可以参考这两个链接:http://www.cocoachina.com/industry/20140522/8517.html ,https://www...

yoyoso
2014/12/21
0
0
iOS开发中的sqlite数据库

1.iOS开发中的数据一般指sqlite,而如果连接服务器,那就另说,那就不是iOS开发直接操作其它数据库,譬如SqlSever,Mysql,Orical。要使用数据库sqlite,首先将libsqlite3.0.dylib加到项目中。...

今日竹石
2014/02/18
0
1
使用FMDB加密数据库的错误尝试

在公司产品上线前, 准备把数据库加密掉, 本来是几行代码的事情, 倒腾了几个小时...... 1. 加密操作 网上大多数方法的做法是, 直接修改方法, 我认为直接修改第三方库的源码, 是不科学的, 我的...

hell03W
2016/11/03
14
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
29分钟前
0
0
php require和include 相对路径一个有趣的坑

以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子 这是项目结构 .├── main.php├── t│ ├── t1.php│ └── t2.php└─...

anoty
30分钟前
15
0
x64技术之SSDT_Hook

测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕...

simpower
31分钟前
0
0
TreeMap源码分析,看了都说好

一、简介 TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很...

Java小铺
41分钟前
0
0
协变、逆变

概念 假设 A、B表示类型 ≤ 表示继承关系 f<⋅>表示类型转换 若A ≤ B,则 A是B的子类,B是A的超类 协变、逆变 什么是型变?型变(type variance)允许对类型进行子类型转换。 为了下面讲解先...

obaniu
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部