我正在为Android编写一个频繁下载游戏排行榜的应用程序。结果存储在数据库中。为了保持下载与实时结果分开,我将其下载到一个表中,然后复制到另一个表中。排行榜表存储当前排名和先前排名。在将下载的版本复制到实时版本之前,我将从当前的更新先前的评级,即:
mDb.execSQL(
"update " + mTableName + " set last_rank = rank, last_world = world;");
然后我从下载表中选择适当的列并替换到实时表中:
mDb.execSQL(
"replace into " + mTableName + " (world, _id, victories, owned_regions, rank,
clan_name) select world, _id, victories, owned_regions, rank, clan_name
from " + mTableName + "_dl;");
如果我在更新后但在替换之前获得了数据库的副本,那么运行Android外部的替换查询(我使用SQLite Expert进行测试),然后我得到预期结果 - 保留last_rank和last_world字段,但是如果我在Android中运行查询,则会复制_dl表的所有字段,并使用tehir默认值覆盖last_rank和last_world。这是Android SQLite实现中的错误还是我做错了什么?
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
再次回答我自己的问题,虽然这不是解决方法的答案。解决方案是使用现有记录集进行外连接。
String sql = String.format(
"replace into %s " +
"select %s.world, " +
"%s._id, " +
"%s.victories, " +
"%s.owned_regions, " +
"%s.rank, " +
"%s.rank as last_rank, " +
"%s.world as last_world, " +
"%s.clan_name, " +
"%s.updated from " +
"%s left outer join " +
"%s on " +
"%s._id = " +
"%s._id",
mTableName, // replace into
mTableName + "_dl", // world
mTableName + "_dl", // ._id
mTableName + "_dl", // victories
mTableName + "_dl", // owned regions
mTableName + "_dl", // dl.current_Rank
mTableName, // prev rank
mTableName, // prev world
mTableName + "_dl", // clan name
mTableName + "_dl", // updated
mTableName + "_dl", // left outer join
mTableName, // on
mTableName, // tablename._id
mTableName + "_dl"); // tablename_dl.id
mSynchronizeQuery = db.compileStatement(sql);
mSynchronizeQuery.execute();
我希望其他人觉得这很有用。