gpt4 book ai didi

iphone - sqlite 准备语句错误-没有这样的表

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:38 26 4
gpt4 key购买 nike

我的 sqlite prepare 语句有些困难。我收到一条错误消息,说我的表不存在,尽管我已经在多个地方检查过它,但它确实存在,所以我很困惑。

  • 该文件位于正确的 iPhone 模拟器应用程序文件夹中
  • 文件已添加到我的项目中并可在项目导航器中查看
  • 它也在我的构建阶段——Copy Bundle Resources 区域。
  • 我打扫干净并重新开始运行。
  • 数据库存在并且运行我的 sql 语句让我得到结果符合我的预期。

    - (NSMutableArray *) getMyWorkout{
    NSMutableArray *workoutArray = [[NSMutableArray alloc] init];
    @try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];

    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"IOSDB.sqlite"];
    NSLog(@"Db path is %@",dbPath);
    BOOL success = [fileMgr fileExistsAtPath:dbPath];

    if(!success) {
    NSLog(@"Cannot locate database file '%@'.", dbPath);
    }

    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)){
    sqlite3_close(db);
    NSLog(@"Failed to open database with message '%s'.", sqlite3_errmsg(db));
    }

    const char *sql = "SELECT Id, type, difficulty, duration, description FROM workoutTbl";
    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK){

    NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(db), sqlite3_errcode(db));
    } //...

当我运行它时,我得到了文件路径和下面的错误

    2013-02-01 18:07:08.060 TriShake[9251:c07] -[MyWorkoutList getMyWorkout] Prepare failure 'no such table: workoutTbl' (1)

我已经检查了这些其他问题,但无法找到解决方案

我知道如果数据库路径不存在,sqlite3_open() 会为你创建一个空数据库,但我知道它存在,所以挫败感接踵而至。如果您能给我任何帮助或指导,我们将不胜感激。

最佳答案

就您的直接问题而言,这将是一些简单的事情。

  1. 你说你已经“清理并重新构建”,但你真的从你的模拟器中删除了旧的应用程序吗?要么手动删除应用程序,要么更简单,通过从“iOS 模拟器”菜单中选择“重置内容和设置”来完全重置模拟器。有时 Xcode 不太清楚要复制哪些文件(特别是在这种情况下,您在设备上运行它可能会更改模拟器包中文件的时间戳!)

  2. 再次运行应用。

  3. 如果该应用程序没有按预期运行,请从 Mac 打开模拟器文件夹中的数据库并检查数据库以确保表格在那里并且与您预期的完全一样。所以导航到应用程序,打开包(您可能必须选择“显示包内容”选项),确认数据库的存在,但同样重要的是,在您最喜欢的 Mac sqlite3 中打开数据库的这个特定副本选择的工具并确认那里的表的存在。

让我们知道您发现了什么。同样,它必须是简单的东西,例如:

  • 也许重建应用程序的过程并没有重新安装所有内容;在我的模拟器上安装期间,我偶尔会遇到 Xcode 选择不重新复制某些内容的问题;

  • 也许您项目中的数据库不小心放在了一个子目录中,更糟糕的是,您可能有两个副本位于不同的目录中;

  • 可能您的 Xcode 项目中的数据库在表格或文件的名称中丢失(或有拼写错误或(尤其是在设备的情况下)文件名大写不正确);

    <

对于其中的许多错误,在完全重置模拟器本身之前,您不会注意到问题。可能有一百万个小问题,但希望完全重置模拟器并重新开始将帮助您找到问题。当涉及到这类问题时,总是很简单。


一些其他的小观察:

  1. 您可能不应该从 bundle 中打开数据库。以编程方式将其从 bundle 复制到 Documents 文件夹,然后从那里打开数据库。我知道这似乎没有必要,但它很重要,原因有很多(如果数据库在应用程序运行期间发生变化,如果数据库不小心在你身上创建,不要让 Xcode 对发生变化的事情感到困惑(即使只有文件时间戳)在 Xcode 背后改变的 bundle 等)

  2. 如果您需要数据库,您应该使用 sqlite3_open_v2 ,使用 SQLITE_OPEN_READWRITE 或 SQLITE_OPEN_READONLY 作为标志(但不要包含 SQLITE_OPEN_CREATE )。让 sqlite 有机会为您创建一个空白数据库或以其他方式修改它会让人头疼,所以永远不要给它这样的机会。

关于iphone - sqlite 准备语句错误-没有这样的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656894/

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