Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中出现意外的SQL查询结果,结果为“0”;替换“;_Android_Sqlite - Fatal编程技术网

Android中出现意外的SQL查询结果,结果为“0”;替换“;

Android中出现意外的SQL查询结果,结果为“0”;替换“;,android,sqlite,Android,Sqlite,我正在为Android编写一个应用程序,它可以频繁地下载游戏排行榜。结果存储在数据库中。为了将下载与实况结果分开,我将下载到一个表中,然后复制到另一个表中。排行榜表格存储当前排名和上一排名。在将下载的版本复制到实时版本之前,我会从当前版本更新以前的评级,即: mDb.execSQL( "update " + mTableName + " set last_rank = rank, last_world = world;"); 然后,我从下载表中选择适当的列并替换到

我正在为Android编写一个应用程序,它可以频繁地下载游戏排行榜。结果存储在数据库中。为了将下载与实况结果分开,我将下载到一个表中,然后复制到另一个表中。排行榜表格存储当前排名和上一排名。在将下载的版本复制到实时版本之前,我会从当前版本更新以前的评级,即:

mDb.execSQL(
      "update " + mTableName + " set last_rank = rank, last_world = world;");         
然后,我从下载表中选择适当的列并替换到live表中:

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。这是安卓SQLite实现中的一个bug还是我做错了什么


任何帮助都将不胜感激。谢谢。

再次回答我自己的问题,尽管这与其说是一个答案,不如说是一个解决办法。解决方案是与现有记录集进行外部联接

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();
我希望其他人会觉得这很有用