【发布时间】:2019-04-04 10:54:29
【问题描述】:
假设我有一个表MyTableName 有三列:COLUMN_NAME_A、COLUMN_NAME_B、COLUMN_NAME_C(为了简化,只有三列,实际上我可能有几十列)。在我当前的实现中,当我插入新行时,所有列都将被覆盖。如何仅覆盖新值不为空的列。一种方法是检查新值,如果它为 NULL,则从表中读取值并重写它。
有没有更简单和/通用的方法?
- (void)insertEntries:(<id<PTDBGeneralInfoTableEntry>>)entry inDatabase:(FMDatabase *)db {
[db beginTransaction];
[self createTableInDatabase:db];
NSString *insertSQL = [NSString stringWithFormat:@"INSERT OR REPLACE INTO MyTableName"
"(%@, %@, %@)"
" VALUES(?, ?, ?)",
COLUMN_NAME_A,
COLUMN_NAME_B,
COLUMN_NAME_C];
NSArray* values = @[entry.valueA ? entry.valueA : [NSNull null],
entry.valueB ? entry.valueB : [NSNull null],
entry.ValueC ? entry.ValueC : [NSNull null]];
BOOL res = [db executeUpdate:insertSQL withArgumentsInArray:values];
[db commit];
}
- (void)createTableInDatabase:(FMDatabase *)db {
NSString* createTableSQL =
[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ ("
"%@ TEXT NOT NULL PRIMARY KEY,"
"%@ INTEGER,"
"%@ REAL"
")",
COLUMN_NAME_A,
COLUMN_NAME_B
COLUMN_NAME_C
];
[db executeUpdate:createTableSQL];
}
【问题讨论】:
标签: objective-c sqlite sql-update