【问题标题】:Sqlite API boolean accessSqlite API 布尔访问
【发布时间】:2010-12-24 10:48:29
【问题描述】:

我认为这应该是一个简单的问题,但我在其他地方没有发现这个问题的答案令人惊讶,所以我在这里发布。

我继承了一个 Sqlite 驱动的数据库,其中包含布尔列,声明如下:

CREATE TABLE example (
  ex_col BOOLEAN NOT NULL DEFAULT 0,
);

这个表正试图通过 sqlite3 C API 调用sqlite_column_* 函数来访问,现在鉴于 sqlite 实际上不支持布尔类型,这里的预期行为是什么?

看来sqlite_column_int() 总是返回 0 或 false,我认为这是因为 sqlite 中的所有列实际上都是文本列...

维护这一点的正确方法是什么 - 作为文本获取,然后将字符串与 true 进行比较?我真的不想修改数据库和附加到它的所有其他代码。

【问题讨论】:

    标签: sql c sqlite


    【解决方案1】:

    一种明显的方法是将其“声明”为整数列,然后在执行 INSERT 或 UPDATE 时将其传递为 1(真)或 0(假)。这样,您就可以保持与 C 语言的兼容性。您甚至不需要将其声明为 int,只要确保始终向其中插入整数就可以了。

    你提到这是一个继承的数据库,他们之前是怎么做的?如果它们存储为文本,那么您可能需要调用sqlite_column_text(),然后对“true”或“false”文字字符串进行字符串匹配。

    【讨论】:

    • 他们以前不必在 C 代码中获取布尔列,因此没有完成。他们有很多用于 sql stmts(ins、upd 等)的#defines 以及一大堆视图和触发器……基本上,该值永远不会直接读取或插入。 :-/
    • 但肯定在某处使用了该值?触发器是否使用列值? #defined 语句怎么样?如果它从未使用过,那它为什么会存在呢? ;-)
    • 是的,像这样#define SQL "UPDATE example SET ex_col='true';",然后这个stmt被正常调用。 sql 代码也是如此,所以我想我只需要将所有内容都作为字符串 (yum) 执行,或者将列类型更改为 Int,这里没有漂亮的解决方案!
    • 不过,您不必担心性能问题。请记住,SQLite 中的所有内容都已经是文本,因此您只是在做一些(诚然)sqlite 应该自己做的工作。我不知道你的代码结构是什么,但在 OOP 设计中,我会创建一个方法或属性来获取值,并在该方法内部进行转换。这也将保护您免受未来对数据库架构的更改(例如,如果您决定稍后使用整数)
    【解决方案2】:

    我有一个数据点可能会给你一个线索。

    SQLite Administrator tool 确实将布尔值转换为字符串“true”和“false”。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2020-09-11
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多