gpt4 book ai didi

ios - SQLite偶尔无法创建:memory: database

转载 作者:行者123 更新时间:2023-12-01 19:46:32 24 4
gpt4 key购买 nike

在我们的单元测试套件中,我们创建和销毁了大量使用 ":memory:" 路径的 SQLite 数据库。有时,仅当在 iOS 模拟器上运行时,这些数据库的创建会失败,并显示相当神秘的消息:

数据库“:内存:”:无法打开数据库文件

99% 的情况下,这些请求都会成功。 (发生此故障后,同一测试运行中的后续测试通常会成功。)但是,当您在自动构建验收测试中使用此测试时,您需要 100%。

我们已对内存消耗(在正常范围内)和磁盘空间可用性(20GB 以上可用)进行了检测。

有什么想法吗?

更新:根据下面理查德的建议,通过额外的日志记录捕获了这种情况。这是日志输出:

SQLITE ERROR: (28) attempt to open "/Users/xxx/Library/Developer/CoreSimulator/Devices/CF762060-7D23-4C79-A466-7F20AB6233E7/data/Containers/Data/Application/582E1ED0-81E0-4CC7-A6F6-DBEBC101BBE8/tmp/etilqs_1ghbf1MSTa8ilSj" as
SQLITE ERROR: (14) cannot open file at line 30595 of [f66f7a17b7]
SQLITE ERROR: (14) os_unix.c:30595: (17) open(/Users/xxx/Library/Developer/CoreSimulator/Devices/CF762060-7D23-4C79-A466-7F20AB6233E7/data/Containers/Data/Application/582E1ED0-81E0-4CC7-A6F6-DBEBC101BBE8/tmp/etilqs_1ghbf1MST

最佳答案

我注意到,如果您创建临时表,即使是 :memory: 数据库也会将文件存储在磁盘上。 unix系统的临时文件是由Prng构建的,因此如果同时创建大量临时文件,名称冲突的可能性不为零。或者,如果磁盘已满,创建可能会失败。或者,如果由于某种原因无法访问 unix 临时目录,因为它已被删除或权限无效。

例如,我通过将这些命令行参数添加到 llvc-gcc 来打开 sqlite3 命令行中的多个记录器: -DSQLITE_DEBUG_OS_TRACE=1 -DSQLITE_TEST=1 -DSQLITE_DEBUG=1 然后我观察到从使用此 SQL 的命令行:

$ ./sqlite3 SQLite version 3.8.8.2 2015-01-30 14:30:45 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> create temporary table t( x ); OPENX 3 /var/folders/nf/l1cw8sn1707b73zy5nqycrpw0000gn/T//etilqs_fvwR6KbMm518S4w 01002 OPEN 3
WRITE 3 512 0 0 OPENX 4 /var/folders/nf/l1cw8sn1707b73zy5nqycrpw0000gn/T//etilqs_OJJJ1lrTtQIFnUO 05402 OPEN 4
WRITE 4 1024 0 0 WRITE 4 1024 1024 0 WRITE 3 28 0 0 sqlite>

关于ios - SQLite偶尔无法创建:memory: database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28838671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com