我刚刚开始使用SQLite,我想将所有应用程序数据写入文件,而不知道文件是否已存在;使用'普通'文件,这很简单,但是对于SQLite,如果表已经存在,我就无法创建表,如果主键已经存在,我就无法插入行。
我基本上想要做一些像“CREATE TABLE IF NOT EXISTS table .... else ... DELETE FROM table”这样的事情。必须有办法做到这一点,我怀疑有一些方法比其他方法更有效。例如,您认为使用现有表而不是删除和重新创建会更好,但这取决于检查它是否存在以及删除其内容所涉及的内容。
或者,有没有办法将数据库写入内存(sqlite3_open(“:memory:”,db)),然后获取其内容 - 作为字节数组或其他东西 - 写入文件?< / p>
答案 0 :(得分:8)
对于所有数据库系统,首先DROP表然后重新创建它几乎总是更有效。使用DELETE将需要索引更新等,而简单的DROP也会删除索引,并且不会涉及创建事务日志条目对于SQLite,您可以执行DROP IF EXISTS来删除表条件。
答案 1 :(得分:1)
如何在某处准备好空的,完全设计的数据库文件。然后,如果目标应用程序数据数据库不存在,请通过复制空db文件来创建它?
答案 2 :(得分:1)
如果您要在将其写回之前的某个时间点读取应用程序数据 - 例如用户设置 - 您将知道数据是否存在。尝试调用包含在异常处理中的表,并且您将知道它们是否存在 - 或者使用数据库表来告诉您存在的内容:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
如果您只想覆盖现有的db文件,您可以轻松地从磁盘中删除db文件,然后运行您的创建代码 - 简单 - 无需在任何地方处理掉线调用。不用担心版本之间的数据库发生了变化。