首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCode9-beta:函数“sqlite3_key”的隐式声明

XCode9-beta:函数“sqlite3_key”的隐式声明
EN

Stack Overflow用户
提问于 2017-06-06 12:29:56
回答 2查看 1.9K关注 0票数 2

我在EncryptedStore SQLCipher包装器加密核心数据时遇到了问题。

我为这个添加了C标志,作为:

代码语言:javascript
复制
Debug = -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC
Release = -DSQLITE_HAS_CODEC -DNDEBUG -DSQLITE_OS_UNIX=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC

并将其用作:

代码语言:javascript
复制
func encryptedCoordinator() -> NSPersistentStoreCoordinator {
  var coordinator:NSPersistentStoreCoordinator?
  let ops:[String : Any] =    [NSMigratePersistentStoresAutomaticallyOption:(true),                                              NSInferMappingModelAutomaticallyOption:(true), EncryptedStorePassphraseKey:sqlCipherKey, EncryptedStoreDatabaseLocation:self.sqliteFileURL()]

  do {
      coordinator = try EncryptedStore.make(options: ops, managedObjectModel: self.managedObjectModel, error: ())
    }catch {
      fatalError("Error opening encrypted DB: \(error)")
    }
    return coordinator!
  }

--它在XCode8中工作得很好,但是它在XCode9-beta中产生了错误。

错误行:

代码语言:javascript
复制
- (BOOL)changeDatabasePassphrase:(NSString *)passphrase error:(NSError *__autoreleasing*)error {
  BOOL result;
  int status;
  if ([passphrase length] > 0) {
    // Password provided, use it to key the DB
    const char *string = [passphrase UTF8String];
    status = sqlite3_rekey(database, string, (int)strlen(string));//ERROR line
    string = NULL;
    passphrase = nil;
  } else {
    // No password
    status = SQLITE_OK;
  }
  result = status == SQLITE_OK;
  if (result) {
    result = [self checkDatabaseStatusWithError:error];
  }
return result && (*error == nil);
}

函数在EncryptedStroe/sqlite3.h中声明为:

代码语言:javascript
复制
SQLITE_API int sqlite3_rekey(
sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey, int nKey     /* The new key */
);
SQLITE_API int sqlite3_rekey_v2(
  sqlite3 *db,                   /* Database to be rekeyed */
  const char *zDbName,           /* Name of the database */
  const void *pKey, int nKey     /* The new key */
);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-07 00:22:27

我认为问题在于导入EncryptedStore.m文件所做的:#import <sqlite3.h>

它使用<>,因此系统sqlite库是导入的,其中不包含这些函数。通过用"“更改<>,一切都编译得很好。

票数 10
EN

Stack Overflow用户

发布于 2017-09-11 10:49:49

找到了另一个解决方案这里

主要改变标题搜索路径。

尝试将其从$(PROJECT_DIR)/sqlcipher/src中更改

转到$(PROJECT_DIR)/sqlcipher

(也就是把/src从路径上移开)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44390045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档