【问题标题】:sqlite db in iphone app error: no such tableiphone应用程序中的sqlite db错误:没有这样的表
【发布时间】:2012-04-08 01:38:37
【问题描述】:

在 iphone 应用程序中将数据推送到我的 sqlite 数据库时出现问题。 这是我创建数据库的方式:

-(IBAction)createButtonPressed:(id)sender
{
    NSLog(@"createButtonPressed: called");
    status.text=[status.text stringByAppendingString:@"create button pressed.\n"];
    NSString *docsDir;
    NSArray *dirPaths;

    // Get the documents directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    // Build the path to the database file
    self.databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"database.sqlite"]];

    NSFileManager *filemgr = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath: databasePath ] == NO)
    {
        status.text=[status.text stringByAppendingString:@"creating database... "];
        status.text=[status.text stringByAppendingFormat:@"path: %@\n\n", databasePath];

    const char *dbpath = [databasePath UTF8String];

        if (sqlite3_open(dbpath, &database) == SQLITE_OK)
        {
            status.text=[status.text stringByAppendingString:@"database opened successfully\n"];

            char *errMsg;
            const char *sql_stmt;
            NSString *sqlStatement=[[NSString alloc] init];

            /*
             CREATING JOB TABLE
             */
            sqlStatement=@"";
            [sqlStatement stringByAppendingString:@"CREATE TABLE IF NOT EXISTS JOB "];
            [sqlStatement stringByAppendingString:@"(ID INTEGER PRIMARY KEY AUTOINCREMENT, "];
            [sqlStatement stringByAppendingString:@"NUMBER TEXT, "];
            [sqlStatement stringByAppendingString:@"DATE_LOADING INTEGER, "];
            [sqlStatement stringByAppendingString:@"DATE_DEPARTURE INTEGER, "];
            [sqlStatement stringByAppendingString:@"DATE_UNLOADING INTEGER, "];
            [sqlStatement stringByAppendingString:@"ORIGIN INTEGER, "];
            [sqlStatement stringByAppendingString:@"DESTINATION INTEGER, "];
            [sqlStatement stringByAppendingString:@"SUPPLIER INTEGER, "];
            [sqlStatement stringByAppendingString:@"RAILROAD INTEGER, "];
            [sqlStatement stringByAppendingString:@"FOREMAN INTEGER, "];
            [sqlStatement stringByAppendingString:@"WEATHER INTEGER, "];
            [sqlStatement stringByAppendingString:@"COMMENT TEXT, "];
            [sqlStatement stringByAppendingString:@"MODIFY_STATUS INTEGER)"];

            sql_stmt = [sqlStatement UTF8String];

            if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
            {
                status.text=[status.text stringByAppendingString:@"failed to create JOB table\n"];
            }
            else
            {
                status.text=[status.text stringByAppendingString:@"JOB table created\n"];
            };


        status.text=[status.text stringByAppendingString:@"closing database...\n"];
        sqlite3_close(database);

    }
    else
    {
        status.text=[status.text stringByAppendingString:@"failed to open/create database\n"];
    };
}
else
{
    status.text=[status.text stringByAppendingString:@"database exists "];
    status.text=[status.text stringByAppendingFormat:@"path: %@\n\n", databasePath];
};

[status scrollRangeToVisible:NSMakeRange([status.text length], 0)];

}

一切都与创建是好的。 但是! 当我尝试将数据推送到我的表时出现错误:“没有这样的表作业” 推送数据代码:

NSLog(@"populateButtonPressed: called");
status.text=[status.text stringByAppendingString:@"populate button pressed.\n"];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: databasePath ] == YES)
{
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        status.text=[status.text stringByAppendingString:@"database opened successfully\n"];

        char *errMsg;
        const char *sql_stmt;
        NSString *sqlStatement=[[NSString alloc] init];

        /*
         POPULATING JOB TABLE
         */
        sqlStatement=@"INSERT INTO JOB (NUMBER, DATE_LOADING, DATE_DEPARTURE, DATE_UNLOADING, ORIGIN, DESTINATION, SUPPLIER, RAILROAD, FOREMAN, WEATHER, COMMENT, MODIFY_STATUS) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        sql_stmt = [sqlStatement UTF8String];
        sqlite3_stmt *stmt;
        sqlite3_prepare_v2(database, sql_stmt, -1, &stmt, nil);
        sqlite3_bind_text(stmt, 1, "number", -1, SQLITE_STATIC); //number
        sqlite3_bind_int(stmt, 2, 100); //date_loading
        sqlite3_bind_int(stmt, 3, 101); //date_departure
        sqlite3_bind_int(stmt, 4, 102); //date_unloading
        sqlite3_bind_int(stmt, 5, 103); //origin
        sqlite3_bind_int(stmt, 6, 104); //destination
        sqlite3_bind_int(stmt, 7, 105); //supplier
        sqlite3_bind_int(stmt, 8, 106); //railroad
        sqlite3_bind_int(stmt, 9, 107); //foreman
        sqlite3_bind_int(stmt, 10, 108); //weather
        sqlite3_bind_text(stmt, 11, "commentstring", -1, SQLITE_STATIC); //comment
        sqlite3_bind_int(stmt, 12, 1);

        if (sqlite3_step(stmt)!=SQLITE_DONE)
        {
            status.text=[status.text stringByAppendingString:@"WARNING!!! Could not step (execute) stmt\n"];
            status.text=[status.text stringByAppendingFormat:@"error: %@\n", [NSString stringWithUTF8String:sqlite3_errmsg(database)]];
        }
        else
        {
            status.text=[status.text stringByAppendingString:@"it seems like stmt step (execute) was successfull"];
        };

        if(sqlite3_finalize(stmt)==SQLITE_DONE)
        {
            status.text=[status.text stringByAppendingString:@"finalizing stmt was successfull\n"];
        }
        else
        {
            status.text=[status.text stringByAppendingString:@"WARNING!!! failed finalizing stmt\n"];
        };


        status.text=[status.text stringByAppendingString:@"closing database...\n"];
        sqlite3_close(database);

    }
    else
    {
        status.text=[status.text stringByAppendingString:@"failed to open database\n"];
    };
}
else
{
    status.text=[status.text stringByAppendingString:@"database does not exist. you need to create it.\n"];
};

[status scrollRangeToVisible:NSMakeRange([status.text length], 0)];

数据库存在于路径并成功打开。 iOS5 ipad 应用程序,使用 ARC 和libsqlite3.dylib,我正在模拟器中运行我的应用程序。

【问题讨论】:

  • sqlite3_prepare_v2(database, sql_stmt, -1, &stmt, nil); 在这一行之后我得到一个错误:“没有这样的表作业”

标签: iphone objective-c ipad sqlite


【解决方案1】:

您的数据库路径是否正确?你为什么不先检查你的终端?

> sqlite3 <your_db_path>

> show tables;

【讨论】:

  • lifeinlagsworkstation:Documents lifeinlags$ sqlite3 database.sqlite SQLite version 3.6.12 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite&gt; show tables ...&gt;
  • 文件 database.sqlite 存在那里。但似乎没有创建表。为什么?我的代码有什么问题? (您可以在我的问题之上看到创建表格代码)
  • 我对此表示怀疑。好吧,我只是建议您在 bit.ly/iUPld0 上花 2 分钟时间。我不知道,因为我讨厌使用普通的 sqlite3 导致很多痛苦,因为周围有很多 sql 包装类。 bit.ly/GFOS1Q
  • 你推荐什么包装器?
猜你喜欢
  • 2015-05-11
  • 2010-12-29
  • 2018-03-27
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多