【问题标题】:How can I overwrite the contents of an SQLite file如何覆盖 SQLite 文件的内容
【发布时间】:2010-12-26 18:30:21
【问题描述】:

我刚刚开始使用 SQLite,我想将我所有的应用程序数据写入一个文件,但不知道该文件是否已经存在;对于“普通”文件,这很简单,但是对于 SQLite,如果表已经存在,我将无法创建表,如果主键已经存在,我将无法插入行。

我基本上想做类似“CREATE TABLE IF NOT EXISTS table..else...DELETE FROM table”之类的事情。必须有办法做到这一点,我怀疑有些方法比其他方法更有效。例如,您会认为使用现有表而不是删除和重新创建会更好,但这取决于检查它是否存在并删除其内容所涉及的内容。

或者,有没有办法将数据库写入内存 (sqlite3_open(":memory:",db)),然后获取其内容 - 作为字节数组或其他东西 - 写入文件?

【问题讨论】:

    标签: sql sqlite overwrite


    【解决方案1】:

    对于所有数据库系统,首先删除表然后重新创建它几乎总是更有效。使用 DELETE 将需要更新索引等,而简单的 DROP 也会删除索引,并且不会涉及创建事务日志条目 对于 SQLite,您可以执行 DROP IF EXISTS 以有条件地删除表。

    【讨论】:

      【解决方案2】:

      如果您要在某个时间点读取应用程序数据,然后再将其写回(例如用户设置),您就会知道数据是否存在。尝试调用包含在异常处理中的表,您就会知道它们是否存在 - 或者使用数据库表来告诉您存在什么:

      SELECT name FROM sqlite_master
      WHERE type='table'
      ORDER BY name;
      

      如果您只想覆盖现有的 db 文件,您可以轻松地从磁盘中删除 db 文件,然后运行您的创建代码 - 简单 - 无需在任何地方使用 drop 调用。不用担心版本之间的数据库发生变化。

      【讨论】:

        【解决方案3】:

        如果在某个地方准备好一个空的、完全设计好的数据库文件呢?那么,如果预期的应用数据数据库不存在,通过复制空的db文件来创建它?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 2017-09-20
          • 1970-01-01
          • 2021-01-11
          • 2016-03-20
          • 1970-01-01
          相关资源
          最近更新 更多