【发布时间】:2012-03-13 20:39:39
【问题描述】:
我对目标 C 很陌生,我只是在学习。我完成了 techotopia 教程“An_Example_SQLite_based_iOS_4_iPhone_Application_(Xcode_4)”,然后尝试使用 FMDB 再次实现它。 (我会发布教程的链接,但我最多只能发布 2 个链接)
问题:在initWithFrame 我创建eventDB。然后在addEvent 中,在按键之后,eventDB.database 的内容发生了变化。 This 是 eventDB 在 initWithFrame 和 this 是在 addEvent。
#import "appTracker.h"
@implementation appTracker
- (id) initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
eventDB = [[appTrackerDB alloc] init];
return self;
}
- (void) keyDown: (NSEvent *) event
{
NSString *chars = [event characters];
unichar character = [chars characterAtIndex: 0];
if (character == 'A') {
NSLog (@"Adding event");
[self addEvent:@"test_arg"];
}
}
- (void) addEvent: (NSString *) name
{
[eventDB setName:name];
[eventDB setPhone:name];
[eventDB setAddress:name];
[eventDB setStatus:name];
[eventDB saveData];
}
...
@end
使用 GDB,我发现它在 main.m(由 XCode4 自动生成)中发生了变化:(不太确定这段代码的作用或它为什么存在)
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
我不熟悉目标 C。有人可以帮我弄清楚为什么我的 eventDB.database 对象被更改了吗?我可能没有正确管理一些内存或完全误解了您应该如何执行此操作。任何帮助将不胜感激。
eventDB 是一个实例:
#import <Foundation/Foundation.h>
#import "FMDatabase.h"
@interface appTrackerDB : NSObject {
NSString *name;
NSString *address;
NSString *phone;
NSString *status;
NSString *databasePath;
FMDatabase *database;
}
谢谢!
还有 [eventDB saveData] 是:
- (void) saveData
{
[database executeUpdate:@"insert into user (name, address, phone) values(?,?,?)",
name, address, phone,nil];
}
并使用以下命令创建数据库:
@implementation appTrackerDB
@synthesize name,address,status,phone;
- (id)init
{
self = [super init];
if (self) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"database.sqlite"];
database = [FMDatabase databaseWithPath:path];
[database open];
[database executeUpdate:@"create table IF NOT EXISTS user(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)"];
if ([database hadError]) {
NSLog(@"DB Error %d: %@", [database lastErrorCode], [database lastErrorMessage]);
}
name = @"TEST";
}
return self;
}
【问题讨论】:
-
你不想改变它吗?我的意思是您在调用 addEvent 时设置名称和地址属性,这会更改对象。还是您在谈论替换对象? (例如指针值发生变化)也许你应该详细说明你的问题到底是什么。
-
我不希望
eventDB.database的内容发生变化。我不会改变那些。 -
aehm... 那么 [eventDB saveData];如果它没有将数据保存到数据库中,该怎么办?
-
对不起,我看到了混乱。问题不是数据库的内容发生了变化,而是对数据库的引用发生了变化。如果您查看问题中的两张图片,您就会明白我的意思。也只是为了完整性,我添加了 saveData 的代码。
-
好的,我明白你的意思了。你是如何初始化实际的 FMDatabase 的?该文档提出了三种不同的方法,可以解释您的问题。
标签: objective-c cocoa fmdb