Внешняя база данных Android в папке активов

У меня есть приложение для Android, которое должно читать и расширять базу данных, которая уже создана на sqlite ... она отлично работает на эмуляторе, помещая базу данных в "данные / данные / (имя_пакет) / базы данных» папка в проводнике файлов эмулятора. Теперь проблема с реальным устройством. Очевидно, что у него нет базы данных для открытия. Я пытался поместить базу данных в папку активов, но я не могу открыть ее с помощью openhelper.

 323go17 июн. 2013 г., 09:12
Либо откройте его только для чтения, либо сначала скопируйте его в личную папку из ресурсов.

Ответы на вопрос(5)

сурсов, вам нужно сначала скопировать ее в путь data / data / (packagename) / database, а затем использовать ее:

 private String DB_PATH = "/data/data/" + "yourpackaename" + "/databases/" + "db.db";

в вашем onCreate ()

 is = getAssets().open("db.db");
 write(is);

Затем метод для вызова:

public void write(InputStream is) {
    try {
        OutputStream out = new FileOutputStream(new File(DB_PATH));
        int read = 0;
        byte[] bytes = new byte[1024];

        while ((read = is.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        is.close();
        out.flush();
        out.close();
        System.err.println(out + "\n");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

У вас есть предварительно заполненная база данных и вы хотите интегрировать ее в свое приложение? Если да, вы можете просто сделать с моей библиотекой

В вашем приложениипервый запуск после установки

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM);

При последующих запусках

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE);

Просто запускайте SQL-запросы

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');");

Получите результаты на массиве в CSV, JSON, XML

ArrayList rows=new ArrayList();
rows=database.sqlEjectCSV("SELECT * FROM food;");
for (int i=0;i

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

 Shubham A.28 авг. 2016 г., 05:36
Это похоже на комментарий.

нее хранилище. Вы можете использовать следующие коды,

private static String DB_PATH = "/data/data/your package/database/";  
private static String DB_NAME ="final.db";// Database name 

Чтобы создать базу данных,

public void createDataBase() throws IOException 
{ 
  //If database not exists copy it from the assets 

   boolean mDataBaseExist = checkDataBase(); 
   if(!mDataBaseExist) 
   { 
      try  
      { 
        //Copy the database from assests 
        copyDataBase(); 
        Log.e(TAG, "createDatabase database created"); 
      }  
      catch (IOException mIOException)  
      { 
         throw new Error("ErrorCopyingDataBase"); 
     } 
  } 
} 

Убедитесь, что база данных существует здесь: / data / data / ваш пакет / database / DB Name

private boolean checkDataBase() 
{ 
    File dbFile = new File(DB_PATH + DB_NAME); 
    return dbFile.exists(); 
} 

Скопируйте базу данных из активов

  private void copyDataBase() throws IOException 
  { 
    InputStream mInput = getApplicationContext().getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream mOutput = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
        mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
}

Я надеюсь, что это должно помочь вам.

 rrbrambley04 мая 2016 г., 19:23
Я считаю, что папка в вашей строке DB_PATH должна иметь множественное число "базы данных» - не "база данных"
 PSIXO05 мая 2014 г., 15:26
Это действительно хороший вопрос, который я тоже хотел бы знать, зачем копировать, когда вы получаете доступ к файлам внутри папки активов?
 Radu21 апр. 2014 г., 18:06
Вы никогда не упоминаете, почему он не работает прямо из папки ресурсов. Не могли бы вы расширить это?
 Gva13 мая 2014 г., 13:58
Папка активов готова только после времени компиляции, и мы не можем изменить данные в ней. Если вы хотите записать в базу данных наше приложение, мы должны сначала скопировать его во внутреннее / внешнее хранилище.

Вы не можете напрямую открывать файлы изактивы папка. Вместо этого вам нужно скопировать содержимое вашегоактивы папка навнутренняя / внешняя память а потом использоватьFile Путь, чтобы открыть файл. В эмуляторах вам проще получить доступ к папке данных ваших приложений. Однако на реальном нерутированном устройстве Android это невозможно из-за соображений безопасности.

 Anas Shahid18 июн. 2013 г., 05:59
да, я тоже пытался .. но мой код, кажется, не работает. может быть, потому что я хочу получить доступ к нескольким таблицам
 waqaslam18 июн. 2013 г., 08:52
Вы можете получить доступ к любому количеству таблиц, не вызывая взаимоблокировок в базе данных. это зависит от того, как вы пытались. если вы разместите некоторый код, это будет легче отладить

Ваш ответ на вопрос