【发布时间】:2018-11-02 10:54:24
【问题描述】:
在我的 iOS 应用程序中,我添加了以下代码,用于检查数据库中是否存在数据。如果是,则更新该记录,否则插入一条新记录。
- (void)saveRoomsToDB:(NSArray *)room{
NSString *dbpath = [[self documentDirectoryPath] stringByAppendingFormat:@"/"databaseName];
database = [FMDatabase databaseWithPath:dbpath];
if([database open]){
[database beginTransaction];
for (Room *roomData in room) {
FMResultSet *result = [database executeQuery:@"SELECT RoomDesc FROM Room WHERE QMSRoomId = ?" withArgumentsInArray:@[@(roomData.RoomId)]];
if ([result next]){
[database executeUpdate:@"UPDATE Room SET QMSSubSectionId = ?,RoomDesc = ?,LastEditedDate = ?,RoomType = ?, isTrue = ?, CyclePerformed = ? WHERE QMSRoomId = ?" withArgumentsInArray:@[@(roomData.QMSSubSectionId), roomData.RoomDesc, roomData.LastEditDate, roomData.rt_description, @(roomData.isTrue), @(roomData.CyclePerformed), @(roomData.RoomId)]];
} else{
[database executeUpdate:@"INSERT INTO Room (QMSSubSectionId, QMSRoomId,RoomDesc, LastEditedDate, RoomNumber,RoomType, CyclePerformed,isTrue) VALUES (?, ?, ?, ?, ?, ?, ?, ?);" withArgumentsInArray:@[@(roomData.QMSSubSectionId), @(roomData.RoomId), roomData.RoomDesc, roomData.LastEditDate, roomData.RoomNumber, roomData.rt_description, @(roomData.CyclePerformed), @(roomData.isTrue)]];
}
}
[database commit];
[database close];
}
}
我已将上述查询执行的日志打印为,
2018-05-23 17:47:49.702 SterileTrakks[656:74128] 房间的记录数:7136
2018-05-23 17:48:07.153 SterileTrakks[656:74128] 房间插入完成`
我可以优化这个查询插入时间吗?我正在考虑应用索引,但还有其他方法吗?
【问题讨论】:
-
与其执行
SELECT,然后根据结果选择执行INSERT或UPDATE,为什么不使用单个INSERT OR REPLACE语句?请参阅 sqlite.org/lang_insert.html 但这将要求QMSRoomId是主键。
标签: ios objective-c performance sqlite