2013-08-16 2 views
0

У меня есть пул слов (около 200 сейчас), которые я хочу отображать случайным образом каждый день без повторения.Получайте уникальное случайное слово из пула каждый день

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

Я пытался добиться этого с помощью двух методов:

Метод 1: Использование БД SQLite

  • Предварительно заполнить БД в папке активов (БД содержит таблицу с двумя столбцами, слова и isUsed)
  • на OnCreate (база данных SQLiteDatabase) копия предварительно заполненную БД в/данные
  • использовать SQLite, чтобы получить случайную запись из БД и обновлять его isUsed противоионы к истинному
  • бритье это слово в ш ared предпочтение так, что если пользователь открывает приложение снова в тот же день, а затем показать это слово
  • Если я обновить слова в БД, то (по 150):
    • создать другой БД в активы папку с новыми словами
    • onUpgrade (SQLiteDatabase дБ, Int oldVersion, Int newVersion) скопировать этот дБ/данные
    • копии каждого слова в исходной БД строка за строкой сохраняя isUsed столбец интактный

Вместо использования пр e db Я могу вставить 200 слов, используя инструкцию SQL в oncreate, а затем обновить остальные 150 с помощью операторов sql в onUpgrade.

Метод 2: Использование общих предпочтений

  • использовать для сохранения 200 слов
  • Создать строку случайных чисел Шифрования до 200 и сохранить его в общем предпочтении
  • поп один случайный номер каждый день и показать слово с этим индексом. Если это тот же самый день, то не поп, но показывать последнее слово
  • Если я обновить слова (от 150):
    • проверить, сколько слова числа увеличилось и генерировать это увеличение числа в в случайном порядок и перемешайте его обратно к исходному случайному строковому массиву

Так что мой вопрос я чувствую, никто из этого не является алгоритм достаточно хорошо. Есть ли лучший способ достичь этого, и если нет, то я должен идти с методом 1, методом 1, но без предварительно заполненного db или метода 2?

ответ

1

Почему бы не просто загрузить строки из простого текстового файла в assets во время onCreate/onUpgrade, перетасовать их и вставить в базу данных? Затем, когда вам нужно знать, какое слово показывать, просто вычислите количество дней с установки приложения (N) и покажите N-е слово.

+0

Это звучит наилучшим образом для меня. Я могу использовать orderby random где isUsed = 0; sqlite stmt для случайного слова. – amol

+0

Что делать, если приложение не используется в один прекрасный день? Слово не используется, но оно все еще недоступно. – kevinsa5

+0

Затем просто увеличивайте N вручную, когда пользователю будет показано следующее слово :-) – kriomant

0

Я чувствую, что метод 1 С предварительно заполненный стол - лучшая ставка.Это поможет вам осознать расширяемость и случайность.

Следует избегать любой огромной задачи в onCreate, поскольку она будет отставать от вашего приложения. И SQLLite db будет полезен, если вам нужно увеличить количество слов позже.

Метод, предлагаемый криоманом, хорош, но обеспечивает свободу случайности. Мы можем предсказать текст после двух полных циклов, если он сидит и пытается это сделать :-)

+0

Поскольку существует ограничение того, что слова должны отображаться без повторений, в обоих случаях есть момент, когда показаны все слова. В вашем случае вам нужно сбросить 'isUsed', в моем случае вы просто перетасовываете слова и устанавливаете N = 0. – kriomant

+0

Ваш метод экономит некоторые циклы процессов в конце списка, да. :-) –

Смежные вопросы