Лучший способ сохранения данных - предпочтения, sqlite, сериализуемые или другие? - PullRequest
7 голосов
/ 10 февраля 2011

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

У меня есть приблизительно 32 КБ данных, которые должны быть сохранены во время onPause.Я исключил предпочтения из-за огромного количества данных.Я провел несколько дней, играя с SQLite, но не смог сохранить данные менее чем за две секунды (хотя время, конечно, не было потрачено впустую).

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

Данные, которые необходимо сохранить, - это в основном девять экземпляров класса A и девять экземпляров класса B. У меня интенсивный месяц обученияКривая Android (и нюансы Java, происходящие из фона C ++) и гуглили как сумасшедшие.Это принесло две возможности:

1) Сериализация (ObjectOutputStream)

Я думал, что это было бы идеальным решением, но, прочитав несколько других постов по этой теме, понял, что это не так.Настоятельно рекомендуется на платформе Android из-за скорости и выделения памяти, вызывающих сборщик мусора в потенциальную ярость.

2) Класс DataOutputStream

Моя текущая мысль - добавить функции Load и Save в оба классаи использовать в них вызовы DataOutputStream и DataInputStream для записи и чтения данных соответственно.

Данные в классах являются примитивами (в основном, строками и целочисленными значениями) и массивами примитивов, поэтому в них нет ничего слишком сложного, чтобы разбитьвниз.Будет ли это второе решение хорошим, жизнеспособным?Или есть другие решения, о которых я пока не знаю?

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Вы должны использовать задачу Async для сохранения данных, я использовал этот метод для получения рекордов в начале игры:

new HighscoreTask().execute(this);

асинхронная задача выглядит следующим образом:

public class HighscoreTask extends AsyncTask<MainView, Void, Void> {

    protected void onPreExecute() {
    }

    protected void onPostExecute(final Void unused) {
    }
    @Override
    protected Void doInBackground(MainView... params) {
        HighScoreFactory.syncScores();
        return null;
    }
}

Все взаимодействие с базой данных происходит в HighScoreFactory.syncScores () , это может занять столько времени, сколько необходимо, поскольку это происходит в фоновом режиме. В моем случае он отправляет HTTP-запрос на внешний сервер и загружает их в базу данных. Это никогда не вызывало никаких проблем и работает без проблем.

2 голосов
/ 11 февраля 2011

Почему у вас есть 2-секундный лимит на запись в вашу базу данных?Если это просто ради отзывчивости пользовательского интерфейса, то есть другой подход, который вы можете использовать.

На самом деле вам не нужно выполнять сохранение в самом методе onPause, вы можете просто запуститьновый Thread, который фактически делает сохранение для вас.

private void backgroundSave(){
    Thread backgroundThread = new Thread() {
        @Override
        public void run() {
            //do save here
        }
    };
    backgroundThread.start();
}

@Override
protected void onPause() {
    super.onPause();
    backgroundSave();
}

Вы можете альтернативно использовать AsyncTask для этого.

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

1 голос
/ 10 февраля 2011

Вы пытались вставить данные в базу данных в транзакции?

try{
 db.beginTransaction();

 //here insert data to database    

 db.setTransactionSuccessful();
} finally {
 db.endTranscation();
}

Это может ускорить работу.

0 голосов
/ 11 февраля 2011

Создайте новый поток, который выполняет запись данных, используя Context.openFileOutput (имя строки, режим int) с этим в качестве контекста.Затем вы можете записать его в фоновом режиме с новым потоком и получить его снова с помощью: Context.openFileInput (String name) с этим контекстом.Надеюсь, это поможет.

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