You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Realm数据库更新数据未生效问题求助

Swift中Realm数据库更新操作不生效问题

我在Swift里写了一个函数,想根据name是否存在来决定是新增还是更新Realm数据:name不存在就添加,存在就用新数据更新,但现在更新操作没生效。

原代码

func savePlayerData(name: String){
    let realm = try! Realm()
    
    let playerData = PBData()
    playerData.dbPlayerName = playerName ?? ""
    playerData.dbServesMade = playerServesMade ?? 0
    playerData.dbServesMissed = playerServesMissed ?? 0
    playerData.dbOffensiveErrors = playerOffensiveErrors ?? 0
    playerData.dbDefensiveErrors = playerDefensiveErrors ?? 0
    playerData.dbTotalGames = Int(getGameNumber()) ?? 0
    playerData.dbTotalServes = Int(getTotalServes()) ?? 0
    playerData.dbTotalErrors = Int(getTotalErrors()) ?? 0

    let players = realm.objects(PBData.self)
    let player = players.where{
        $0.dbPlayerName == name
    }
    
    print("Player count is \(player.count)")
    if player.count > 0{
        
        print("Method name is \(name)")
        print("Player name is \(playerName!)")
        print("Serves made is \(playerServesMade!)")
        print("Serves missed is \(playerServesMissed!)")
        print("Offensive errors is \(playerOffensiveErrors!)")
        print("Defensive erros missed is \(playerDefensiveErrors!)")
        print("Total games is \(playerTotalGames!)")
        print("Total serves is \(playerTotalServes!)")
        print("Total errors is \(playerTotalErrors!)")
        
        do {
            try realm.write{
                playerData.dbPlayerName = name
                playerData.dbServesMade = playerServesMade!
                playerData.dbServesMissed = playerServesMissed!
                playerData.dbOffensiveErrors = playerOffensiveErrors!
                playerData.dbDefensiveErrors = playerDefensiveErrors!
                playerData.dbTotalGames = playerTotalGames!
                playerData.dbTotalServes = playerTotalServes!
                playerData.dbTotalErrors = playerTotalErrors!
            }
            print("Updated existing player data")
        }catch{
            print("Error saving data \(error)")
        }
    }else{
        do {
            try realm.write {
                realm.add(playerData)
            }
            print("Added new player and player data")
        } catch {
            print("Error saving data \(error)")
        }
    }
}

执行结果

新增玩家时

Player text is K
Player count is 0
Added new player and player data
Save K

(新增后数据库显示正常)

更新现有玩家时

Player text is K
Player count is 1
Method name is K
Player name is K
Serves made is 2
Serves missed is 2
Offensive errors is 2
Defensive erros missed is 2
Total games is 1
Total serves is 4
Total errors is 4
Updated existing player data
Save K

所有参数值均正确,但数据库中未体现更新后的数据。

问题原因与修复

问题核心:更新逻辑中修改的是新创建的PBData实例,而非Realm中已持久化的对象。Realm只会追踪自己管理的对象,修改未被持久化的新实例不会同步到数据库。

修正后的代码

func savePlayerData(name: String){
    let realm = try! Realm()
    
    // 先查询是否存在目标玩家对象
    let existingPlayer = realm.objects(PBData.self).where {
        $0.dbPlayerName == name
    }.first
    
    if let player = existingPlayer {
        // 存在则直接更新Realm中已有的对象
        print("Method name is \(name)")
        print("Player name is \(playerName!)")
        print("Serves made is \(playerServesMade!)")
        print("Serves missed is \(playerServesMissed!)")
        print("Offensive errors is \(playerOffensiveErrors!)")
        print("Defensive erros missed is \(playerDefensiveErrors!)")
        print("Total games is \(playerTotalGames!)")
        print("Total serves is \(playerTotalServes!)")
        print("Total errors is \(playerTotalErrors!)")
        
        do {
            try realm.write {
                player.dbServesMade = playerServesMade!
                player.dbServesMissed = playerServesMissed!
                player.dbOffensiveErrors = playerOffensiveErrors!
                player.dbDefensiveErrors = playerDefensiveErrors!
                player.dbTotalGames = playerTotalGames!
                player.dbTotalServes = playerTotalServes!
                player.dbTotalErrors = playerTotalErrors!
            }
            print("Updated existing player data")
        } catch {
            print("Error saving data \(error)")
        }
    } else {
        // 不存在则创建新对象并添加到Realm
        let playerData = PBData()
        playerData.dbPlayerName = name
        playerData.dbServesMade = playerServesMade ?? 0
        playerData.dbServesMissed = playerServesMissed ?? 0
        playerData.dbOffensiveErrors = playerOffensiveErrors ?? 0
        playerData.dbDefensiveErrors = playerDefensiveErrors ?? 0
        playerData.dbTotalGames = Int(getGameNumber()) ?? 0
        playerData.dbTotalServes = Int(getTotalServes()) ?? 0
        playerData.dbTotalErrors = Int(getTotalErrors()) ?? 0
        
        do {
            try realm.write {
                realm.add(playerData)
            }
            print("Added new player and player data")
        } catch {
            print("Error saving data \(error)")
        }
    }
}

关键修改点

  • 用first直接获取Realm中已存在的单个玩家对象,而非查询结果集合
  • 更新时直接修改Realm追踪的对象属性,而非操作新创建的实例
  • 将新增逻辑移至else分支,避免不必要的对象创建

内容的提问来源于stack exchange,提问作者keithh534

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:07:03