【问题标题】:sqlite prepare statement error - no such tablesqlite 准备语句错误 - 没有这样的表
【发布时间】:2015-02-24 00:54:53
【问题描述】:

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

  • 该文件位于正确的 iPhone 模拟器应用程序文件夹中
  • 该文件已添加到我的项目中,并可在项目导航器中查看
  • 它也在我的构建阶段 - 复制捆绑资源区域。
  • 我已经打扫干净,又开始跑步了。
  • 数据库存在并且运行我的 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() 会为您创建一个空数据库,但我知道它存在,因此会产生挫败感。您能给我的任何帮助或指导将不胜感激。

【问题讨论】:

  • 正如它所说的那样......检查您的数据库中的表名并确保它是正确的。确保表名是workoutTbl,大小写匹配。如果该表不存在,您将需要创建它。它may 为您创建数据库文件,但您仍然需要创建表模式。如果您已经创建了表,请发布您的架构。
  • 首先确保您正在处理您认为的数据库。如果您尝试对捆绑包中的数据库进行操作,您将无法对其进行修改。如果您以某种方式弄乱了名称,SQLite 会很高兴地创建一个新的空表。但是 SQLite 在它的消息中是相当可靠的。如果它说没有同名的表,那么就没有。
  • (请注意,您的项目中可能有一个原型数据库,您认为该数据库已包含在捆绑包中,但事实并非如此。)

标签: iphone ios objective-c sqlite


【解决方案1】:

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

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

  2. 再次运行应用程序。

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

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

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

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

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

    李>

对于很多此类错误,在您完全重置模拟器本身之前,您不会注意到问题。它可能是一百万件小事,但希望完全重置模拟器并重新开始将帮助您找到问题。对于这类问题,总是很简单。


其他一些小观察:

  1. 您可能不应该从捆绑包中打开数据库。以编程方式将其从捆绑包复制到 Documents 文件夹,然后从那里打开数据库。我知道这似乎没有必要,但出于多种原因,这很重要(如果 db 在应用程序运行期间发生更改,如果 db 意外在您身上创建,请不要让 Xcode 对更改的内容感到困惑(即使只是文件时间戳)在 Xcode 背后更改的包中等等)

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

【讨论】:

  • 如果可以的话,我会给你+3——那里有几个很好的建议。
  • 太棒了!谢谢你。通过重置模拟器的内容,我能够摆脱我的 no such table 错误。我还检查了捆绑资源,它表明我的表确实存在。现在,当我运行它时,应用程序可以正常连接到我的表,但随后收到一条错误消息,提示“文件已加密或不是数据库”。我猜它现在又犯了另一个错误! :-)
  • @nniroclax 这通常表明数据库以某种方式损坏。我会从头开始重新创建它,看看问题是否仍然存在。
【解决方案2】:

我遇到了和你一样的问题。如果IOS找不到指定的数据库文件,默认会为你创建一个,而不是报错。因此,您必须打开 IOS 为您创建的数据库文件,该文件是空白的,因此它当然包含您期望的表。 我如何处理它: 1 您必须将名为 *.sqlite3 的资源文件捆绑到您的项目中 2 然后你必须使用 [NSBundle mainBundle] pathFordirectory...... 函数来搜索你正确的数据库文件。 然后你就可以打开你期望的数据库文件并可以正常操作了

最好的问候,

【讨论】:

    【解决方案3】:

    没有足够的代表来评论 Jack 的帖子,但这对我有帮助。

    就我而言,我输入了错误的资源扩展路径:

    // Wrong
    NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"productList"
                                                             ofType:@"sqlite3"];
    
    // Should have been (added db ext)
    NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"productList"
                                                         ofType:@"db"];
    

    我总会过去的:

    if (sqlite3_open([sqLiteDb UTF8String], &_database) == SQLITE_OK))
    

    因为它会自动为我创建一个 db 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2016-11-18
      • 2015-05-11
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多