【问题标题】:Checking if a table exists and if it does not exist, create it... iOS/SQLite检查表是否存在,如果不存在,则创建它... iOS/SQLite
【发布时间】:2019-06-01 15:24:24
【问题描述】:

我目前有一个可以从中提取数据的表。我想做的是检查表是否已经存在于包中,如果不存在,我想创建表并将其保存到包中(意味着路径将在主包中)。我希望在 setInput 方法的顶部检查和创建数据库。我一直在寻找类似的东西,但我还没有想出任何东西。非常感谢任何帮助。这是我的代码:

-(IBAction)setInput:(id)sender
{
    NSString *strStoreNumber;
    NSString *strRegNumber;

    strStoreNumber = StoreNumber.text;
    strRegNumber = RegNumber.text;
    lblStoreNumber.text = strStoreNumber;
    lblRegNumber.text = strRegNumber;

    NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    {
        NSLog(@"Opened sqlite database at %@", databasePath);
        sqlite3_exec(database, "CREATE TABLE IF NOT EXISTS tblStore (ID INTEGER PRIMARY KEY AUTOINCREMENT, Message TEXT)", NULL, NULL, NULL);
        //...stuff
    } 
    else 
    {
        NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database));
        sqlite3_close (database);
    }
//    
    NSString *querystring;

    // create your statement
    querystring = [NSString stringWithFormat:@"SELECT strStore, strReg FROM tblStore WHERE strStore = %@ AND strReg = %@;", strStoreNumber, strRegNumber];  

    const char *sql = [querystring UTF8String];

    NSString *szStore = nil;
    NSString *szReg = nil;

    sqlite3_stmt *statement = nil;
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) //queryString = Statement
    {
        NSLog(@"sql problem occured with: %s", sql);
        NSLog(@"%s", sqlite3_errmsg(database));
    }
    else
    {
        // you could handle multiple rows here
        while (sqlite3_step(statement) == SQLITE_ROW) 
        {            
            szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
            szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
        }        

    }

    sqlite3_finalize(statement);

    lblStoreNumber.text = szStore;
    lblRegNumber.text = szReg;

//   
} 

我对 iOS 和 SQLite 还是很陌生,所以如果我没有提供足够准确的描述来说明我正在尝试做什么,请告诉我,我会尝试更具体。谢谢!

【问题讨论】:

    标签: ios sqlite


    【解决方案1】:

    快速搜索“iphone sql create table if not exists”将this 列为最高结果。

    这部分 SQL 可能就是您要查找的内容:

    CREATE TABLE IF NOT EXISTS tableName( ... )
    

    如果表不存在,它会创建一个表。

    【讨论】:

    • 我在 sqlite3_open 方法下编辑了我的代码,并为创建表添加了类似的逻辑。我从项目中删除了现有表(通过 Finder),当我尝试运行应用程序时,出现错误:“错误:/Users/Matt****/Documents/iOS Projects/CCoDBTry/CCoDBTry/tblStore. sqlite:没有这样的文件或目录”。您能否就此提供更多见解?
    • 我想我也没有关注如何使它不存在。我认为将其从 Finder 中的项目位置中删除可以解决问题,但是当我这样做时我什至无法编译。有什么想法吗?
    • 似乎您不仅删除了表,还删除了整个数据库。您可以尝试恢复您在 Finder 中删除的数据库文件,然后重试。如果你只想删除那个特定的表,你可以使用DROP TABLE tableName。另外,请查看this blog
    【解决方案2】:

    使用 sqlite swift 创建表

    func createTable(_ tableName:String) {
            sqlStatement = "CREATE TABLE \(tableName)(Id TEXT,Details BLOB,Type TEXT)"
            if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
                if sqlite3_step(compiledStatement) == SQLITE_DONE {
                    print("table created")
                }
                else {
                    print("table could not be created")
                }
            }
            else {
                print("Create table statement could not be prepared")
            }
            sqlite3_finalize(compiledStatement)
        }
    

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2011-05-12
      相关资源
      最近更新 更多