Davis (5-9) broke a personal four-start losing streak, scattering four hits in boosting the Royals to a fifth consecutive victory. The right-hander worked around three walks while striking out four.
Louis Coleman got the final two outs of the eighth inning and Greg Holland was helped out by David Lough's diving catch of a Jeff Keppinger liner in the ninth inning to record his 26th save.
The Royals broke a scoreless tie in the sixth when Eric Hosmer singled, went to second on Billy Butler's hit, advanced to third on a deep fly by Salvador Perez and scored on Cain's double to left field.
Chris Sale (6-10) absorbed a complete-game loss for the White Sox, yielding just the single run on seven hits. He walked one and struck out seven.