2016-04-01 3 views
-1

Я создаю функцию, которая обеспечивает обновление базы данных sqlite. У меня есть база данных (например, demo.db) в папке с ресурсами, которая копируется в папку с данными при первом входе в приложение Android. Однако, когда у меня есть новая версия для моего приложения, мне нужно заменить SQLite таблицы в папке активов, которые уже были созданы в данных/данных folder.Here мой код:Скопируйте таблицу sqlite из активов в данные/данные в Android

MySQLiteHelpter расширяет SQLiteOpenHelper:

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     for(int i = oldVersion; i <= newVersion; i++){ 
      switch (i){ 
       case 8: 
        //delete the older table 
        db.execSQL("drop table if exists " + DFY_BD_DISTRICT); 

        //do something. 
        //I need to copy the table from the assets folder even I have already created the database in the previous version. 

        break; 
      } 
     } 
    } 

Вот мой код я использую, чтобы скопировать свою базу данных в папку данных/данных в первый раз:

public static void loadDB(Context context, String dbName) { 
    String packName = context.getPackageName(); 
    String dbPath = "data/data/" + packName + "/databases"; 

    try { 
     File e = new File(dbPath); 
     if(!e.exists()) { 
      e.mkdirs(); 
     } 

     File dest = new File(e, dbName); 
     if(dest.exists()) { 
      return; 
     } 

     dest.createNewFile(); 
     InputStream in = context.getResources().getAssets().open(dbName); 
     int size = in.available(); 
     byte[] buf = new byte[size]; 
     in.read(buf); 
     in.close(); 
     FileOutputStream out = new FileOutputStream(dest); 
     out.write(buf); 
     out.close(); 
    } catch (Exception var10) { 
     var10.printStackTrace(); 
    } 

} 

Как я искал в Интернете, я нашел какой-то вопрос, похожий на мой: https://stackoverflow.com/questions/12264860/android-sqlite-database-copying-table-from-assets-to-local-app-database Я рад, что если вы можете мне помочь:) Если вам нужно больше кода или более вопросов, я как можно скорее вставлю свой код.

ответ

0

Вы можете использовать следующую функцию для копирования базы данных локальных активов на устройство Android.

String DB_PATH = "/data/data/com.example.app/databases/" 


public String initialiseDB(String dbName,String copyas,Context context) 
    { 

     try 
     {    
      File f = new File(DB_PATH); 
      if (!f.exists()) 
      { 
       f.mkdir(); 
      } 

      // Open your local db as the input stream 
      InputStream myInput = context.getAssets().open(dbName); 

      // File for creating the database 
      String outFileName = DB_PATH + copyas; 

      File tmpFile = new File(outFileName); 


      // check if the database already exist 

      if (!tmpFile.exists()){ 
      //Log.d(LOG_TAG, outFileName + "database not available, initialising seed"); 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      // transfer bytes from the input file to the output file 
      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(); 
} 


     } catch (Exception e) 
     { 
      e.printStackTrace(); 
      Log.e(LOG_TAG, e.toString()); 
      return "failure"; 
     } 

     return "SUCCESS"; 

    } 

Я надеюсь, что это поможет вам ... Сообщите мне, если у вас есть проблемы с его достижением.

+0

Спасибо за ваш код ~ Но ваш код, похоже, скопирует базу данных в первый раз, когда я вхожу в приложение, а не копирую таблицу в базе данных из данных в папку данных/данных ~ – LinaInverce

+0

Этот код обычно работает для Android 6.0+? –

+0

В вашем случае @ LinaInverce ---- вы можете удалить старые данные db в обновлении и скопировать новый db из активов программным путем. – beginner

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