我会一步一步地完成我的过程,所以请耐心等待。首先,我将同步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 = '%@'
希望我对此很清楚。
答案 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 ...
查询