执行插入或更新2个表SQLITE的有效方法

时间:2015-07-08 14:55:52

标签: ios sql objective-c database sqlite

我会一步一步地完成我的过程,所以请耐心等待。首先,我将同步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 = '%@'

希望我对此很清楚。

2 个答案:

答案 0 :(得分:1)

SQLite没有信息架构。

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

答案 1 :(得分:0)

我能够使用以下查询在我的应用程序的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 ...查询