sqlite3 无法为我读取数据库,但无法读取另一台机器上的相同提交

发布于 2024-11-10 00:17:09 字数 1082 浏览 2 评论 0原文

背景

我们有一个 iPhone 应用程序,它使用 sqlite 来存储大型数据库。我们使用 FTS3 全文搜索,因此我们必须“推出我们自己的”sqlite,而不是使用 iOS SDK 中包含的库。我们使用合并的 sqlite.c 文件,并使用 FMDB 作为 Obj-C 包装器。

问题

我的项目可以编译,但由于我安装的用于检测数据库是否出现故障的异常而崩溃(稍后会详细介绍)。然而,我的搭档正在愉快地编码,没有任何问题 - 与我的提交版本完全相同。这就是奇怪的地方。

具体来说,应用程序在首次加载时执行以下操作:

  1. 将数据库复制到用户的文档目录中,使其可写。 (工作正常)
  2. 使用 FMDB 的 databaseWithPath: 打开数据库,然后使用 open
  3. 此时在 FMDB 上调用 goodConnection 返回 YES - 数据库确实已打开并正在运行。
  4. 调用 SELECT * FROM sqlite_master WHERE type = 'table' 不会返回任何记录。 (应该有很多表)

我尝试过的

现在,如果您要求 sqlite“打开”一个不存在的数据库 - 它只会创建一个。这就是这种行为的样子。因此,我打开了一个终端窗口,导航到模拟器上应用程序的文档目录,然后输入:

Makbook:Documents makdad$ sqlite3 myDB.db

Which running sqlite3 ,当然,一切看起来都很好。我所有的数据都在那里。

我逐行检查了 FMDB 的打开方法,以确保打开正确的数据库。看来我确实是这样。

我尝试的第一件事是降级到 Xcode 3.2.6。同样的问题,所以我想我已经排除了 Xcode 3/4 编译方面的差异(尽管我一开始对此有所怀疑)。

有谁有任何调试功能可以尝试,或者知道我的问题可能是什么?

BACKGROUND

We have an iPhone app that uses sqlite for a large database. We use FTS3, full text search, so we have to "roll our own" sqlite instead of using the library included in the iOS SDK. We use the amalgamated sqlite.c file, and we use FMDB as an Obj-C wrapper.

THE PROBLEM

My project compiles, but it crashes on an exception that I've installed to detect if the database is malfunctioning (more on that in a bit). My partner, however, is merrily coding away, with no problems - on the EXACT SAME commit revision as me. That's what's weird.

Specifically, the app does the following on first load:

  1. Copy the database into the user's document directory so that it is writeable. (working OK)
  2. Open the database using FMDB's databaseWithPath: followed by open.
  3. Calling goodConnection on FMDB at this point returns YES - the database is indeed open and working.
  4. Calling SELECT * FROM sqlite_master WHERE type = 'table' returns no records. (there should be many tables)

WHAT I'VE TRIED

Now, if you ask sqlite to "open" a database that doesn't exist -- it'll just create one. That's what this behavior looks like. So, I opened up a Terminal window, navigated to my app's Documents directory on the simulator, and typed:

Makbook:Documents makdad$ sqlite3 myDB.db

Which runs sqlite3, and, of course, everything looks fine. All my data is there.

I stepped through line-by-line of FMDB's open method to make sure I was opening the right database. It looks like I certainly am.

First thing I tried was downgrading to Xcode 3.2.6. Same problem, so I think I've ruled out an Xcode 3/4 difference in compiling (although I suspected that at first).

Does anyone have any debugging-fu to try, or any knowledge as to what my problem could be?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

開玄 2024-11-17 00:17:09

我们自定义编译的 SQLite3 也有同样的问题。我在这个博客上找到了这个问题的解决方案http:// /regularrateandrhythm.com/regular-rate-rhythm-blog/sqlite3-fts-in-IOS4.html

Had the same issue with our custom compiled SQLite3. I found a solution to this problem on this blog http://regularrateandrhythm.com/regular-rate-rhythm-blog/sqlite3-fts-in-IOS4.html

魂牵梦绕锁你心扉 2024-11-17 00:17:09

问题出在 iOS 4.3 SDK 模拟器上。我忽略了对 iOS 设备本身的测试,但它确实有效。

为了支持较旧的 iOS 版本,我们使用 -weak_library /usr/lib/libSystem.B.dylib 链接器标志。在 iOS Simulator 4.3 上删除该标志可以阻止与 sqlite3 相关的所有奇怪行为。

我的合作伙伴没有遇到问题的原因是他们运行的是 Xcode 3.2.5,即 4.2。即使我降级到 Xcode 3,我仍然安装了 4 - 所以 3 也使用了 4.3 SDK。

我将提出一个关于新问题的新问题,因为这个问题与实际问题相去甚远:)

The problem is with the iOS 4.3 SDK Simulator. I had neglected to test the iOS device itself, and it works.

To support older iOS versions, we use the -weak_library /usr/lib/libSystem.B.dylib linker flag. Removing that flag on iOS Simulator 4.3 stops ALL the weird behavior relating to sqlite3.

The reason my partners weren't having the problem is that they are running Xcode 3.2.5, which is 4.2. Even when I downgraded to Xcode 3, I still had 4 installed - so 3 was using the 4.3 SDK as well.

I am going to open a new question about the new issue, as this question is so far off the actual issue :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文