Это безопасный и правильный способ сохранить файл во внутренней памяти?

#android #memory #save

#Android #память #Сохранить

Вопрос:

Я использовал следующий код, но интуитивно я вижу, что это не слишком безопасно. Будет ли это работать безупречно на каждом устройстве? Этот код копирует во внутреннюю память мою основную базу данных (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:

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

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

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

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

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

Комментарии:

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