【问题标题】:Efficient way to execute an insert or update 2 tables SQLITE执行插入或更新 2 个表 SQLITE 的有效方法
【发布时间】:2015-09-26 13:56:53
【问题描述】:

我将逐步引导您完成我的流程,请耐心等待。所以首先我将一个同步 SQLITE 数据库附加到我的主 SQLITE 数据库。附加完成后,我将选择主数据库中可用的所有列(此处的此步骤是为了避免同步 SQLITE 数据库可能具有主 SQLITE 数据库没有的任何其他列。)强>

PRAGMA table_info('%@')

然后我遍历所有列并将它们格式化为字符串。

  NSString * pragmaInfo = [NSString stringWithFormat:@"PRAGMA table_info('%@')",currentTable];

                        const char *tableInfo = [pragmaInfo UTF8String];
                        NSString * columns;
                        [columnString setString:@""];
                        NSString * lastColumn;
                        sqlite3_stmt * colStatement;
                        if (sqlite3_prepare(threadedMAINDB, tableInfo, -1, &colStatement, NULL)==SQLITE_OK) {
                            while (sqlite3_step(colStatement)== SQLITE_ROW) {
                                    if (sqlite3_column_text(colStatement, 1)) {
                                      columns = [NSString stringWithUTF8String:(char *)sqlite3_column_text(colStatement, 1)];
                                    [columnString appendString:[NSString stringWithFormat:@"%@,",columns]];
                                    lastColumn = columns;
                                }
                            }
                            sqlite3_finalize(colStatement);

这是我当前的插入或更新查询。请注意,它有效。

//Where columnString is a prepared mutable string of all the columns available in the main SQLITE database
     NSString *tblUpdate = [NSString stringWithFormat:@"INSERT or REPLACE INTO main.%@ (%@) SELECT %@ FROM sync_db.%@",currentTable, columnString,columnString,currentTable];

现在这是我的问题。有没有一种方法可以获取表中所有可用的列名,而无需执行 AND 循环并准备一个字符串以最终插入 INSERT 或 REPLACE 查询?我在考虑这个查询的内容:

select column_name
    from INFORMATION_SCHEMA.COLUMNS 
    where table_name = 'table';

我在我的 SELECT 语句中尝试过这个,但 SQLITE 抱怨我的“。”期间。

INSERT or REPLACE INTO main.table_name SELECT column_name FROM main.INFORMATION_SCHEMA.COLUMNS where sync.table_name = '%@'

希望我对此很清楚。

【问题讨论】:

    标签: ios sql objective-c database sqlite


    【解决方案1】:

    SQLite 没有信息架构。

    如果您还不知道列名,则执行PRAGMA table_info 是获取它们的唯一方法。

    【讨论】:

      【解决方案2】:

      我能够通过以下查询在我的应用程序的 SQLite 数据库中检索我的表的语句

      SELECT name FROM sqlite_master 
      WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
      UNION ALL 
      SELECT name FROM sqlite_temp_master 
      WHERE type IN ('table','view') 
      ORDER BY 1
      

      使用此查询的语句,我将遍历每一行并进行字符串比较以查看是否已创建表。如果未找到该字符串,我将对丢失的表执行 CREATE TABLE ... 查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-22
        • 2015-03-12
        • 2012-10-29
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        相关资源
        最近更新 更多