文档章节

FMDB/SQLCipher数据库管理

我爱觉觉
 我爱觉觉
发布于 2015/10/16 11:03
字数 726
阅读 98
收藏 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
海淀
私信 提问
加密数据库 SQLCipher 4.0.0 正式发布

SQLCipher 4.0.0 版本已发布,这是一个重要的更新版本,包含一些新特性、改进和修复。 更新亮点如下: 新的 KDF 算法:PBKDF2-HMAC-SHA512 HMAC-SHA512 现在被作为 HMAC 的默认 KDF 算法 默认...

王练
2018/12/02
0
1
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
SQLCipher 1.1.8 发布,SQLite加密库

SQLCipher 提供了对 SQLite 数据库的传输层进行全面加密的工具。而通过使用 SQLCipher ,整个加密过程对客户端是透明的,无需改动应用程序。 该版本修复了一个bug,当使用某些特定的加密头中...

红薯
2010/10/05
1K
0
「Android」GreenDao

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

为安然
2018/07/30
0
0
腾讯移动数据库框架 WCDB 首个 Swift 版本发布

WCDB 1.0.6 已发布,WCDB 是腾讯开源的一个高效、完整、易用的移动数据库框架,基于 SQLCipher ,支持 iOS、macOS 和 Android 。 更新内容: iOS/macOS WCDB 首个 Swift 版本发布,包含与 Ob...

王练
2018/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

java 树形图构建

https://blog.csdn.net/massivestars/article/details/53911620/

kuchawyz
26分钟前
1
0
零基础如何学习大数据技术,大数据学习路线是什么?

在目前,当零基础学习大数据视频教程前,首先我们要学习Java语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 对于小白学习大数据需要注意的点有很多,但无论如何,既然...

董黎明
28分钟前
2
0
123

123

lifes77
29分钟前
0
0
MySQL游标

MySQL游标 While循环 -- MySQL游标只能用于存储过程和函数-- 使用过程 声明、打开游标、使用游标、关闭游标-- 如果未明确关闭游标,END时会自动关闭-- https://dev.mysql.com/doc/refman/...

yysue
29分钟前
1
0
互联网下半场的角逐,玩转轻资产的大数据服务 | 阿里云栖开发者沙龙大数据专场(北京站)干货集锦

2019年1月18日下午,一个晴冷的冬日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学。当日,近200名大数据开发者和爱好者现...

阿里云官方博客
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部