Неожиданный результат SQL-запроса в Android с заменой - PullRequest
0 голосов
/ 23 апреля 2011

Я пишу приложение для 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 будут скопированы, а last_rank и last_world будут перезаписаны значениями по умолчанию.Это ошибка в реализации Android SQLite или я делаю что-то очень неправильное?

Буду признателен за любую помощь.Спасибо.

1 Ответ

0 голосов
/ 03 мая 2011

Снова отвечаю на мой вопрос, хотя это не столько ответ, сколько обходной путь. Решением было сделать внешнее соединение с существующим набором записей.

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();

Я надеюсь, что кто-то еще найдет это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...