Как прочитать файл LARGE Sqlite для копирования в эмулятор Android или устройство из папки активов? - PullRequest
0 голосов
/ 28 мая 2010

Полагаю, многие уже читали эту статью:

Использование собственной базы данных SQLite в приложениях Android: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/comment-page-2/#comment-12368

Тем не менее, IOException продолжает увеличиваться до

while ((length = myInput.read(buffer))>0){
    myOutput.write(buffer, 0, length);
}

Я пытаюсь использовать большой файл БД. Это больше, чем> 8 МБ Я построил его с использованием sqlite3 в Mac OS X, вставил строки в кодировке UTF-8 (я использую корейский), добавил таблицу android_meta с ko_KR в качестве локали, как указано выше.

Однако, когда я отлаживаю, IOException продолжает показывать значение

length=myInput.read(buffer)

Я подозреваю, что это вызвано попыткой чтения большого файла.Если нет, я понятия не имею, почему.Я тестировал тот же код, используя гораздо меньший текстовый файл, и он работал нормально.

Может кто-нибудь помочь мне в этом?Я искал много мест, но ни одно место не дало мне четкого ответа или хорошего решения.Хороший смысл эффективен или прост.

Я попытаюсь использовать BufferedInput (Output) Stream , но если более простой не может работать, я не думаю, что это тоже будет работать.

Может кто-нибудь объяснить основные ограничения в области ввода / вывода файлов в Android и, возможно, правильный путь? Я буду очень признателен за чей-либо внимательный ответ.Спасибо.

с более подробной информацией:

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(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();

    }

Ответы [ 4 ]

2 голосов
/ 02 февраля 2011

Измените расширение файла на .mp3, например:

IOException при чтении из InputStream

2 голосов
/ 28 мая 2010

Я был там. Я считаю, что тип ресурса RAW свободен от ограничений максимального размера (тогда как активы, или, более конкретно, поток, связанный с активом, ограничен по размеру).

Как только вы преодолеете это препятствие, у вас все будет в порядке - у меня на телефоне были базы данных объемом более 100 МБ.

2 голосов
/ 28 мая 2010

Может ли кто-нибудь помочь мне в этом?

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

0 голосов
/ 28 мая 2010

Не знаю, поможет ли это вам, но если другие подходы не сработают, вы можете попробовать использовать NIO . Например, - это реализация копирования inputtream в fileoutput. Кроме того, вы можете попробовать заархивировать файл и посмотреть, могут ли инструменты Android распаковать , чтобы распаковать их непосредственно в вашу папку базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...