2016-04-18 4 views
0

Я ранее хранил базу данных sqlite в папке с ресурсами приложений, но теперь переместил базу данных на внешнее хранилище.Открытие базы данных с внешнего хранилища Android

Мой предыдущий copyDatabase() метод выглядел так.

private void copyDataBase() throws IOException { 
     InputStream myInput = myContext.getAssets().open(DATABASE_NAME); 
     OutputStream myOutput = new FileOutputStream(DB_PATH); 
     byte[] buffer = new byte[AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT]; 
     while (true) { 
      int length = myInput.read(buffer); 
      if (length > 0) { 
       myOutput.write(buffer, 0, length); 
      } else { 
       myOutput.flush(); 
       myOutput.close(); 
       myInput.close(); 
       return; 
      } 
     } 
    } 

Вопрос в том, что я не уверен, как создать InputStream для открытия базы данных из внешнего хранилища. Я не могу найти внешний эквивалент хранения для myContext.getAssets().open(DATABASE_NAME);

Текущего путь к базе данных:

DB_PATH = Environment.getExternalStorageDirectory().getPath().toString()+"/SoulInfoDatabase/BB2SoulDatabase.db"; 
+0

Возможно, вы захотите взглянуть на [базу данных SQLite на SD-карте] (http://stackoverflow.com/questions/4806181/sqlite-database-on-sd-card), поскольку это может обеспечить решение. – MikeT

+0

Возможный дубликат [Отправка приложения с помощью базы данных] (http://stackoverflow.com/questions/513084/ship-an-application-with-a-database) –

ответ

1

Шаг 1: Дайте разрешение для хранения в вашем App манифест файл:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Шаг 2 : Копирование базы данных на вашу собственную SD-карту. Путь

private void copyDataBase() throws IOException { 
    // Open your local db as the input stream 
    InputStream myInput = context.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + "/" + DB_NAME; 

    // Open the empty db as the output stream 
    new File(outFileName).createNewFile(); 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 

    // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

Шаг 3: Затем откройте вашу базу данных:

try { 
     db = SQLiteDatabase.openDatabase(DB_PATH + "/" + DB_NAME, null, 
       SQLiteDatabase.OPEN_READWRITE 
         | SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     return false; 
    } 

ГДЕ

String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SoulInfoDatabase"; 
File file = new File(filePath); 
if(!file.exists()){ 
    file.mkdirs(); 
} 

DB_PATH = Filepath; DB_NAME = "BB2SoulDatabase.sqlite";

+0

Привет, Shahadat, спасибо за ответ. Интересно, как InputStream myInput = context.getAssets(). Open (DB_NAME); работать, когда у меня нет базы данных в папке с моими активами? – M0rty

+0

Я хочу писать из внешнего хранилища во внутреннее хранилище – M0rty

+0

Уверены ли вы, что у вас нет файла sqlite базы данных в папке с ресурсами? –

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