gpt4 book ai didi

objective-c - 在 Xcode 中访问数据库时,SQLite 不会准备查询

转载 作者:行者123 更新时间:2023-11-28 20:32:55 25 4
gpt4 key购买 nike

我是一名 iPhone 开发新手,试图从 Xcode 4.3 中的 sqlite 数据库中获取信息。我的数据库(名为 DB_Info.sqlite)与我的 .h 和 .m 文件位于同一目录中,我还将数据库拖到 Xcode 左侧栏的文件夹部分。

能否请您快速看一下我的代码,让我知道我的错误在哪里?我已经使用 NSLogs 来确定问题发生的位置,在最后一个 if 语句中,它写在注释中。非常感谢您!

#import <sqlite3.h>
@implementation Player
{
sqlite3 *DB_Info;
NSString *databasePath;
NSString *docsDir;
NSArray *dirPaths;
}

-(Player*)createPlayer:(NSString*)playerName
{

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"DB_Info.sqlite"]];
const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;

if (sqlite3_open(dbpath, &DB_Info) == SQLITE_OK) { //works fine

NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM playerlist WHERE fullName=\"%@\"", playerName];

const char *query_stmt = [querySQL UTF8String];

if (sqlite3_prepare_v2(DB_Info, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //PROBLEM: This is where the problem is, and the if statement never goes through
//....rest of code here
} else {
NSLog(@"Error");
}
}

最佳答案

首先,不要只说“错误”,而是记录 SQL 错误消息

NSLog(@"%s SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));` 

它会准确地告诉您哪里出了问题。人们第一次做 SQL 项目的一个常见错误是找不到表。如果是这样,请继续阅读。 (如果没有,请随意忽略其余部分。)

其次,您要在您的文档文件夹中查找您的数据库。你有没有在某个时候明确地将它从你的包复制到你的文档文件夹?还是您以编程方式创建它?但是,如果您提前准备好它,在您将其复制到 Documents 文件夹之前,它不会出现在该文件夹中。

第三,我还建议您考虑使用 sqlite3_open_v2 而不是 sqlite3_open。您正在检查这是否是 SQLITE_OK,但这可能会给人一种错误的安全感。 sqlite3_open 将创建一个数据库(如果它不存在),这显然不是您的意图。在您使用此方法之前,您的应用程序大概应该从 bundle 中复制数据库或为您创建数据库和表(并且您没有显示它,所以我不确定您是否正在这样做)。无论如何,如果数据库不存在,sqlite3_open_v2 函数将不会创建数据库,除非您通过包含 SQLITE_OPEN_CREATE 明确请求它这样做。因此,如果未找到类似以下的内容,则不会创建数据库:

if (sqlite3_open_v2(dbpath, &DB_Info, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) {

如果为您创建了一个空白数据库,我建议您通过模拟器菜单上的“重置内容和设置”来重置您的模拟器,或者明确删除该应用程序,这样任何空白数据库可能有已创建的可以删除。如果您在设备上运行此应用程序,请删除该应用程序并重新安装。

第四,如果数据库已经提前创建好,你确认数据库已经包含在“Copy Bundle Resources”设置中了吗?例如:

copy bundle resources

第五,如果您在模拟器上运行该应用程序,您可以随时浏览模拟器的文件结构并确保您的文件位于您认为的位置。您还可以运行 Mac OS sqlite 程序来检查模拟器正在使用的数据库,以确保一切正常。您甚至可以直接在模拟器使用的数据库中测试您的 SQL,这对于诊断目的很有用。 (或者,如果您不喜欢基于 Mac 文本的 sqlite 程序,您也可以购买/下载图形工具,例如 Base。)在执行此操作之前,您可能首先想要配置您的 Mac 以便您可以轻松浏览模拟器的文件需要您启动终端程序,并发出命令:

chflags nohidden ~/Library

然后你可以浏览到“~/Library/Application\Support/iPhone\Simulator/5.1/Applications/”然后浏览你拥有的各种应用程序并确保你的数据库文件在那里。

关于objective-c - 在 Xcode 中访问数据库时,SQLite 不会准备查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11605072/

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