文档章节

FMDB/SQLCipher数据库管理

我爱觉觉
 我爱觉觉
发布于 2015/10/16 11:03
字数 726
阅读 86
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

负载均衡的解决方案有哪些

负载均衡器服务可满足大型组织的需求,支持所有数据中心和跨数据中心高可靠性场景。 本地负载均衡,通过附带或者未附带持久性覆盖选项,Incapsula支持各种负载均衡算法,以优化服务器之间的流...

上树的熊
45分钟前
4
0
Java实现在线打开word文档加盖印章/盖章/签名功能

前言: 我们知道,大型一点的OA办公系统都会有很多在线处理office办公文档的需求。其中有一点也基本绕不开,那就是为文档盖章或添加手写签名来保护文档,让被盖章的文档不再被编辑。 在Java中...

山里的红杏
52分钟前
5
0
js控制输入正负数,小数点后保留两位

//限制数字function clearNoNum(obj){ //修复第一个字符是小数点 的情况. if(obj.value !=''&& obj.value.substr(0,1) == '.'){ obj.value=""; } obj.value ...

一直在成长的程序猿
55分钟前
2
0
动态代理

具体场景 为了使代理类与被代理类对第三方有相同的函数,代理类与被代理类一般实现一个公共的interface,定义如下 public interface Subject { void rent(); void hello(String s)...

wuyiyi
59分钟前
2
0
时间字段

我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间 mysql数据库:它们分别是 date、datetime、time、timestamp和year。date :“yyyy-mm-dd”格式表示的日期值 time :“hh:...

DemonsI
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部