2015-10-26 14 views
-1

Я хочу отправить свое приложение для Android со встроенной базой данных. Поиск в сети я обнаружил, что люди отправляют его в активы приложения, а затем копируют его в другой каталог во время установки/первого запуска.Android встроенная база данных только для чтения

В моем случае мне нужна база данных только для чтения, поэтому я не хочу делать несколько ее копий. Можно ли использовать его непосредственно из активов? Есть ли способ сохранить это пространство?

+0

Почему кто-то голосует за этот вопрос? Это не имеет смысла. – shadox

ответ

0

Я думаю, что это не возможно, проверить этот же вопрос здесь: Reading sqlite file from asset folder

Чтобы использовать базу данных, которую необходимо скопировать его в папку активов в папку в директорию внутри приложения.

Проверьте этот код.

public class DataBaseHelper extends SQLiteOpenHelper { 
    private Context mycontext; 
    private static String DB_NAME = "(datbasename).sqlite"; 
    public SQLiteDatabase myDataBase; 


    public DataBaseHelper(Context context) throws IOException { 
     super(context,DB_NAME,null,1); 
     this.mycontext=context; 
     boolean dbexist = checkdatabase(); 
     if (dbexist) { 
      //System.out.println("Database exists"); 
      opendatabase(); 
     } else { 
      System.out.println("Database doesn't exist"); 
      createdatabase(); 
     } 
    } 

    public void createdatabase() throws IOException { 
     boolean dbexist = checkdatabase(); 
     if(dbexist) { 
      System.out.println(" Database exists."); 
     } else { 
      this.getReadableDatabase(); 
      try { 
       copydatabase(); 
      } catch(IOException e) { 
       throw new Error("Error copying database"); 
      } 
     } 
    } 

    private boolean checkdatabase() { 

     boolean checkdb = false; 
     try { 
      String myPath = DB_PATH + DB_NAME; 
      File dbfile = new File(myPath); 

      checkdb = dbfile.exists(); 
     } catch(SQLiteException e) { 
      System.out.println("Database doesn't exist"); 
     } 
     return checkdb; 
    } 

    private void copydatabase() throws IOException { 
     //Open your local db as the input stream 
     InputStream myinput = mycontext.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 
     OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases /(datbasename).sqlite"); 

     // transfer byte to inputfile to 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(); 
    } 

    public void opendatabase() throws SQLException { 
     //Open the database 
     String mypath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    public synchronized void close() { 
     if(myDataBase != null) { 
      myDataBase.close(); 
     } 
     super.close(); 
    } 
} 
2

В моем случае мне нужна база данных только для чтения, поэтому я не хочу делать несколько ее копий. Можно ли использовать его непосредственно из активов? Есть ли способ сохранить это пространство?

Нет. Активы не являются обычными файлами на вашем устройстве, и нет возможности, чтобы библиотека sqlite считывала их напрямую.

Либо просто скопируйте файл, используя, например, sqlite-asset-helper или не использовать базу данных sqlite, а скорее то, что может работать с InputStream s, предоставленное AssetManager.

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