Android предварительно заполнить базу данных sqlite - PullRequest
5 голосов
/ 10 марта 2011

В моем приложении есть база данных sqlite. Мое приложение не должно отправлять это как пустую базу данных, но определенные записи должны быть созданы прежде, чем пользователь сможет использовать приложение в первый раз. Конечно, у меня может быть много операторов вставки, но это кажется очень странным. Я подумал о чем-то вроде http://vineetyadav.com/tutorials/11-adding-prefilled-sqlite-database-to-android-app.html, который в основном работает, но это означает, что моей созданной вручную БД также нужны все внутренние таблицы, такие как android_metadata. Поэтому мне нужно знать, какие существуют внутренние таблицы и как их заполнять. Или другой умный способ иметь предварительно заполненную базу данных. Есть предложения?

Спасибо, А.

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Вы можете прочитать простой файл с SD-карты с 1 оператором вставки на строку и выполнить итерацию по этому файлу.

Вот аналогичный пример, в котором я читаю файл и добавляю ContactItem в мой contact_list:

public ArrayList<ContactItem> readInputFile(Context context, String filename) {
    String text = null;
    BufferedReader reader = null;
    ArrayList<ContactItem> contact_list = new ArrayList<ContactItem>();
    contact_list.clear();  // Clear any existing contacts when a new file is read
    try {
        reader = new BufferedReader(new FileReader(filename));
        // Repeat until EOF
        while (((text = reader.readLine()) != null)) {
            if (!(text.length() > 1024)) {  //  If we read more than 1k per line there's a problem with the input file format
                ContactItem c = new ContactItem(text);
                if (c.getIsValid()) {
                    //  We were able to parse a well formed phone number from the last line read
                    contact_list.add(c);
                }
            }
        }
    } catch (FileNotFoundException e) {
        Toast.makeText(context, R.string.error_fileNotFound, 1).show();
        e.printStackTrace();
    } catch (IOException e) {
        Toast.makeText(context, R.string.error_ioException, 1).show();
        e.printStackTrace();
    } finally { // EOFException (or other, but EOF is handled and most likely)
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            Toast.makeText(context, R.string.error_generalFailure, 1).show();
            e.printStackTrace();
        }
    }
    return contact_list;
}
2 голосов
/ 10 марта 2011

Я сохранил данные в каталоге res / raw как JSON. Когда приложение было открыто в первый раз, я использовал AsyncTask, прочитал файл JSON (использовал библиотеку GSON) и заполнил им свою базу данных.

Я пробовал это примерно с 1000 записями, и это сработало для меня. Это все еще заняло некоторое время - около 15-30 секунд на эмуляторе.

Не уверен, что это лучший способ.

1 голос
/ 10 марта 2011

Лично я только что сделал операторы вставки, но у меня было только 2, так что это не показалось мне чрезмерным.

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

android_metadata отображается в браузере баз данных SQLite как созданный, например, CREATE TABLE android_metadata(locale TEXT).

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

ТогдаВы можете легко воссоздать и добавить его?

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