本文介绍对性能数据、SQL执行、错误信息的监控,以及对错误处理信息的处理。

全局监控

开发者可以注册全局监控,获取性能数据、SQL的执行及报错信息。

性能监控

以下是性能监控的示例代码:

  1. Database.globalTrace(ofPerformance: { (tag, sqls, cost) in
  2. if let wrappedTag = tag {
  3. print("Tag: \(wrappedTag) ")
  4. }else {
  5. print("Nil tag")
  6. }
  7. sqls.forEach({ (arg) in
  8. print("SQL: \(arg.key) Count: \(arg.value)")
  9. })
  10. print("Total cost \(cost) nanoseconds")
  11. })

性能数据会以 事务 为单位体现在监控中。对于没有手动启用事务的操作,单次操作就是一个事务。

WCDB Swift 默认不开启性能监控。

SQL 监控

以下是 SQL 监控的示例代码:

  1. Database.globalTrace(ofSQL: { (sql) in
  2. print("SQL: \(sql)")
  3. })

每一条执行的 SQL 都会毫无遗漏的在监控中体现。对于熟悉 SQLite 的开发者,可以通过该接口确认操作执行的 SQL 与期望是否一致

WCDB Swift 默认不开启 SQL 监控。

错误监控

以下是错误监控的示例代码:

  1. Database.globalTrace(ofError: { (error) in
  2. switch error.type {
  3. case .sqliteGlobal:
  4. debugPrint("[WCDB][DEBUG] \(error.description)")
  5. case .warning:
  6. print("[WCDB][WARNING] \(error.description)")
  7. default:
  8. print("[WCDB][ERROR] \(error.description)")
  9. }
  10. })

每一个错误信息都会在监控中体现。开发者可以注册该接口将错误上报到后台进行监控。

WCDB Swift 默认开启错误监控,以便于开发者发现错误。上述示例代码就是 WCDB Swift 内错误监控的默认实现。

错误处理

除了上述的错误监控,错误还会从函数声明包含 throws 中产生。

  1. do {
  2. try database.insert(objects: object, intoTable: "non-existent-table")
  3. }catch let error as WCDBSwift.Error {
  4. print(error)
  5. }

所有错误都是 WCDBSwift.Error 类型,其中最重要的是错误类型和错误码本身,其对应关系如下:

错误类型描述错误码
SQLiteSQLite 错误请参考 SQLite 的相关文档
systemCall系统调用错误,一般来自文件操作相关的接口请参考 errno
coreWCDB Swift 错误,来自 WCDB Swift Core 层请参考错误信息 message 的描述
interfaceWCDB Swift 错误,来自 WCDB Swift Interface 层请参考错误信息 message 的描述
abort开发阶段错误,一般是开发阶段错误,应当在发布前修复请参考错误信息 message 的描述
warning警告信息,开发者可自行判断是否修复请参考错误信息 message 的描述
SQLiteGlobalSQLite log,不一定是错误请参考 SQLite 的相关文档
SQLiteGlobalSQLite 的输出信息会有较多重复,而前者除了错误信息,还会输出部分 SQLite 内部的 log。因此其可以作为 debug log,而 SQLite 作为 error log。当信息只在 SQLiteGlobal 中,而不在 SQLite 中出现时,一般可忽略。

除此之外,WCDBSwift.Error 还包含了 tagpathoperationmessageSQLextended code 等相关信息,以便于调试和发现问题。