如何读取LARGE Sqlite文件从资源文件夹复制到Android模拟器或设备?

时间:2010-05-28 10:28:50

标签: android file sqlite input

我想很多人已经读过这篇文章了:

Using your own SQLite database in Android applications: 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);
}

我正在尝试使用大型DB文件。 它大于> 8MB 我在Mac OS X中使用sqlite3构建它,插入了UTF-8编码的字符串(因为我使用的是韩语), 使用ko_KR作为语言环境添加了android_meta表,如上所述。

但是,当我调试时,它会在

处继续显示IOException
length=myInput.read(buffer)

我怀疑这是因为尝试阅读大文件造成的。如果没有,我不知道为什么。 我使用更小的文本文件测试了相同的代码,并且工作正常。

任何人都可以帮我解决这个问题吗?我搜索了很多地方,但没有地方给了我明确的答案,或者很好的解决方案。 良好的意义有效或容易。

我会尝试使用 BufferedInput(输出)流,但如果更简单的那个无法工作,我认为这也无效。

任何人都可以解释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 个答案:

答案 0 :(得分:2)

  

任何人都可以帮我解决这个问题吗?

使用较小的文件。或者是一组较小的文件,在打开包装时将它们拼接成一个大文件。或者在第一次运行应用程序时下载数据库。

答案 1 :(得分:2)

我去过那儿。我相信RAW资源类型没有最大大小限制(而资产,或更具体地说,连接到资产的流,大小有限)。

一旦你克服了这个障碍你应该没问题 - 我手机上的数据库已超过100MB。

答案 2 :(得分:2)

将文件的扩展名更改为.mp3,例如:

IOException while reading from InputStream

答案 3 :(得分:0)

不知道它是否会对您有所帮助,但如果其他方法失败,您可以尝试使用NIO。例如,将输入流复制到fileoutput的here's an implementation。或者,您可以尝试压缩文件,看看Android unzipping工具是否可以直接解压缩到您的db文件夹。