Это безопасный и правильный способ сохранить файл во внутренней памяти? - PullRequest
0 голосов
/ 25 октября 2011

Я использовал следующий код, но интуитивно я вижу, что это не слишком безопасно. Будет ли это работать безупречно в каждом устройстве? Этот код копирует во внутреннюю память мою основную базу данных (100 КБ) при первом запуске приложения. Спасибо за ваше время.

private void CopyDBtoInternal() {

    String path = "/data/data/com.myproject/databases/";
    String DB_DESTINATION = "/data/data/com.myproject/databases/sample.db";

    // Check if the database exists before copying
    boolean initialiseDatabase = (new File(DB_DESTINATION)).exists();
    if (initialiseDatabase == false) {

        //create folders
        File db_folder = new File(path);
        db_folder.mkdirs();

        AssetManager assetManager = getApplicationContext().getAssets();

        try {
            InputStream is = assetManager.open("sample.db");

            // Copy the database into the destination
            OutputStream os = new FileOutputStream(DB_DESTINATION);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0){
                os.write(buffer, 0, length);
            }
            os.flush();

            os.close();
            is.close();

        } catch (IOException e) {
            e.printStackTrace();
            AlertDialog.Builder dialogo = new AlertDialog.Builder(AppGuiaDeBulas.this);
            dialogo.setTitle("Alerta");
            dialogo.setMessage("It was not possible to save database. Error #001");
            dialogo.setNeutralButton("OK", null);
            dialogo.show();
        }
    }

}

1 Ответ

1 голос
/ 25 октября 2011

Ознакомьтесь с этой частью статьи о записи в хранилище.

Если вы используете API уровня 8 (Froyo) или выше, используйте getExternalFilesDir () , чтобы открыть файл, представляющий каталог внешнего хранилища, в котором вы должны сохранить свои файлы. Этот метод принимает параметр типа, который задает тип подкаталога, который вы хотите, например, DIRECTORY_MUSIC и DIRECTORY_RINGTONES (передайте значение null, чтобы получить корень каталога файлов вашего приложения). Этот метод создаст соответствующий каталог при необходимости. Указывая тип каталога, вы гарантируете, что медиа-сканер Android будет правильно классифицировать ваши файлы в системе (например, рингтоны идентифицируются как рингтоны, а не музыка). Если пользователь удалит ваше приложение, этот каталог и все его содержимое будут удалены.

Если вы используете API уровня 7 или ниже, используйте getExternalStorageDirectory () , чтобы открыть файл, представляющий корень внешнего хранилища. Затем вы должны записать свои данные в следующую директорию:

/ Android / данные // файлы / Имя вашего пакета в стиле Java, например, com.example.android.app. Если на устройстве пользователя работает API уровня 8 или выше, и они удаляют ваше приложение, этот каталог и все его содержимое будут удалены.

http://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles

...