24

我不得不搜索有关这些错误的许多帖子,但我仍然无法解决问题。这是我的代码,谁能帮我看看出了什么问题?

- (void) copyDatabaseIfNeeded {


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
   NSString *path = [documentsDirectory stringByAppendingPathComponent:@"SQL.sqlite"];

    if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) 
    {
        NSLog(@"Database opened successfully");

if(updateStmt == nil) {
            NSString *updStmt = [NSString stringWithFormat: @"UPDATE Coffee SET CoffeeName = '500 Plus', Price = '1.40' Where CoffeeID= '3'"];
   const char *mupdate_stmt = [updStmt UTF8String]; 

if(sqlite3_prepare_v2(newDBconnection, mupdate_stmt, -1, &updateStmt, NULL) != SQLITE_OK){
NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(newDBconnection));
            } else {
                NSLog(@"Update successful");
            }

        }
        if(SQLITE_DONE != sqlite3_step(updateStmt))
            NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(newDBconnection));
        else {
            sqlite3_reset(updateStmt);
            NSLog(@"Step successful");

        }
    } 
    else 
    {
        NSLog(@"Error in opening database  ");
    }
}
4

3 回答 3

46

中没有表CoffeeSQL.sqlite

如果数据库文件不存在,SQLite 会静默创建数据库文件。因此,如果您path弄错了,您将打开一个空的数据库文件,其中当然不包含任何表。确保数据库文件在那里存在并且不为空。

SELECT * FROM sqlite_master;您可以通过运行查询来查看数据库中有哪些表。

于 2012-08-24T07:15:04.297 回答
3

当我遇到数据库问题(在这种情况下为 Oracle)时,我的 DBA 告诉我的一件事是使用命令行工具尝试查询。

这是您诊断 sqlite3 和 iPhone 模拟器问题的方法:

  1. 在 iPhone 模拟器中运行应用程序,以便在 Documents 目录中创建/复制数据库。
  2. 启动终端
  3. cd ~/Library/Application Support/iPhone Simulator/<version>/Applications/<your-app-hash>/Documents. 最好只在模拟器中安装一个 App,这样 App 是什么一目了然。
  4. sqlite3 SQL.sqlite并从那里尝试您的查询。您还可以使用该.schema命令查看架构的外观。

如果查询在那里工作而不是在你的应用程序中,那么你知道你有一个错误,否则你有一个 sqlite 查询问题或损坏的架构。

于 2012-08-24T07:08:29.147 回答
1

尝试重新安装应用程序。这些表是在安装应用程序时创建的。有时它可能会发生,因为没有创建表

于 2017-01-16T12:41:16.400 回答