如何使用 SQLite 修复“没有这样的表”错误

问题描述 投票:0回答:5

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

- (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  ");
    }
}
database sqlite xcode4 dbtable
5个回答
51
投票

Coffee
中没有桌子
SQL.sqlite

如果数据库文件不存在,SQLite 会默默地创建该文件。因此,如果您弄错了

path
,那么您将打开一个空数据库文件,当然它不包含任何表。确保数据库文件存在并且不为空。

您可以通过运行

SELECT * FROM sqlite_master;
查询来查看数据库中有哪些表。


3
投票

当我遇到数据库问题(本例中为 Oracle)时,我的 DBA 告诉我的一件事是尝试使用命令行工具进行查询。

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

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

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


1
投票

尝试重新安装应用程序。表是在安装应用程序时创建的。有时可能会因为未创建表而发生这种情况


0
投票

我遇到了“没有这样的表错误”,因为 db 文件从未复制到 bin 文件夹。 项目中的 .db 文件确保其属性“复制到输出目录”设置为:

  • 始终复制(始终复制空白数据库)
  • 如果较新请复制

0
投票

我在下面遇到了同样的错误:

解析错误:没有这样的表:public.user

当我尝试将表名称

public.user
重命名为
user
时,如下所示。 *当我使用
RebaseData
将 PostgreSQL 转储文件转换为 SQLite 转储文件时,出现了带有 . 的表名:

ALTER TABLE public.user RENAME TO user;

所以,我使用

''
""
代替
public.user
,如下所示,然后我可以重命名表名称而不会出现错误:

          # ↓           ↓
ALTER TABLE 'public.user' RENAME TO user;

或者:

          # ↓           ↓
ALTER TABLE "public.user" RENAME TO user;
© www.soinside.com 2019 - 2024. All rights reserved.