2010-05-28 45 views
0

我想很多人都已经看过这篇文章:如何阅读LARGE Sqlite文件复制到Android模拟器或资产文件夹中的设备?

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

我'试图用一个大的数据库文件。 它大到> 8MB 我在Mac OS X中使用sqlite3构建了它,插入了UTF-8编码的字符串(对于我使用的是韩语), 将ko_KR作为语言环境添加了android_meta表,如上所述。

然而,当我调试,它不断出现在

length=myInput.read(buffer) 

IOException异常,我怀疑它是由试图读取大文件引起的。如果没有,我不知道为什么。 我使用更小的文本文件测试了相同的代码,并且它工作正常。

谁能帮我这个?我搜遍了很多地方,但没有一个地方给我明确的答案,或者很好的解决方案。 有效或容易的好意思。

我会尝试使用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(); 

    } 
+0

为什么需要本地如此多的数据?看起来像移动应用程序开发的一个基本问题......一些Android设备仍然有限的内存,重新设计你的应用程序,以便它从网上读取并在本地缓存少量数据,8MB对于只有一个应用程序看起来很多(考虑复杂的应用程序,如谷歌地图,只需8MB ...) – 2010-05-28 19:24:31

回答

2

谁能帮我出这个:

更多的细节

使用较小的文件。或者一组较小的文件,当您解压缩它们时,它们会拼接成一个大文件。或者在第一次运行应用程序时下载数据库。

+0

谢谢你的答案。我用这种方式,并将我的大SQLite文件加载到模拟器中。 – petershine 2010-05-31 07:15:43

+0

在https://gist.github.com/717801添加了Gist – petershine 2011-01-16 14:03:16

2

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

一旦你过去这一关你应该罚款 - 我有我的手机上的数据库超过100MB。

+0

如何使用数据库我们需要将数据库复制到数据/数据/包名/数据库,或者我们可以直接使用数据库。如果是的话如何? – kthorat 2010-11-30 18:29:39

+0

在我的情况下,我有一个不到5 MB的数据库。数据库被放置在带有jpg扩展名的资产文件夹中以避免资源压缩。这在某些设备上导致了OutOfMemoryErrors(例如HTC Wildfire)。将数据库移动到/ res/raw并使用getResources()。openRawResource(R.raw.database)读取文件后,OutOfMemoryErrors消失了!非常感谢你! – bplayer 2012-08-10 12:59:41

0

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

相关问题