gpt4 book ai didi

iphone - DB Wrapper 不响应消息?

转载 作者:行者123 更新时间:2023-12-01 22:50:07 25 4
gpt4 key购买 nike

我正在为 iphone-sdk 2.2.1 开发(所以没有 CoreData 哭泣)。

所以我使用 FMDatabase project ,它只是 Obj C 中的一个 SQLite 包装器。从我的 AppDelegate 与它交互时,我的数据库运行良好。我已经从 AppDelegate 测试了连接、插入等。

现在,我有一个要存储到数据库中的数据对象。我希望这个事件发生在 ViewController 类中。让我们看一些代码:

App Delegate 在 applicationDidFinishLaunching 方法中创建数据库。 DB 被声明为此类的属性,因此我可以轻松访问它。

db = [FMDatabase databaseWithPath:[self getDBPath]];

这很好用,我已经测试过了。我唯一有点担心的是“db”是类的属性。这不应该引起问题,不是吗?

从同一个 applicationDidFinishLaunching 方法中,我测试了一个简单的插入是否可以使用。这有效:
[db beginTransaction];
[db executeUpdate:@"INSERT INTO tblDataSamples (...) VALUES (...);"];
[db commit];

现在,如果我只是简单地将这个确切的代码移到 AppDelegate 的一个实例方法中,那么该代码将不再有效。我得到一个 "EXC_BAD_ACCESS"当我们点击 [db beginTransaction] 行时出错。

此代码到此调用的流程:
- AltViewController 接收按钮点击事件
- AltViewController 告诉 ApplicationDelegate 执行“addSample”方法。
- ApplicationDelegate 的 addSample 方法在 [db beginTransaction] 上失败。

现在我已经把它写出来了,我想问题是我的数据库在 ApplicationDelegate 加载 RootView 后丢失了。也许我错了。有人有想法么?

!!!!!!!!!

更新!
我刚刚更改了我的 addSample 方法以包含
db = [FMDatabase databaseWithPath:[self getDBPath]];
if (![db open]) {
NSLog(@"Could not open db.");
}


[db close];

整个交易现在有效。所以,新的问题是:我如何使数据库打开一次并在不同的 View 和 View Controller 之间保持打开状态?

最佳答案

您遇到了麻烦,因为您还不知道内存管理规则。在这种情况下,databaseWithPath:方法返回一个自动释放的对象,该对象在运行循环结束时被释放。您的 db 指针仍然指向那个无效的内存位置,这就是您看到 EXC_BAD_ACCESS 的原因。稍后尝试访问它时出错。

好消息是内存管理在 Cocoa 中实际上很容易学习。看看this page对于初学者来说,它应该有足够的信息让你继续前进。要解决这个特殊问题,您需要调用 retain在创建 db 对象后对其进行方法,并在不再需要时释放它(如果您在应用程序的整个生命周期中保留它,则释放它不会获得任何好处,但这仍然是一个好习惯)。

关于iphone - DB Wrapper 不响应消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/794445/

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