首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建海量数据的android应用数据库

创建海量数据的android应用数据库
EN

Stack Overflow用户
提问于 2009-12-24 00:28:43
回答 4查看 3.3K关注 0票数 6

我的应用程序的数据库需要填充大量数据,所以在onCreate()期间,不仅仅是一些create table sql指令,还有很多插入操作。我选择的解决方案是将所有这些指令存储在res/raw中的一个sql文件中,该文件由Resources.openRawResource(id)加载。

它工作得很好,但我面临着编码问题,我在sql文件中有一些突出的字符,这在我的应用程序中看起来很糟糕。下面是我做这件事的代码:

代码语言:javascript
复制
public String getFileContent(Resources resources, int rawId) throws
IOException
  {
    InputStream is = resources.openRawResource(rawId);
    int size = is.available();
    // Read the entire asset into a local byte buffer.
    byte[] buffer = new byte[size];
    is.read(buffer);
    is.close();
    // Convert the buffer into a string.
    return new String(buffer);
  }

public void onCreate(SQLiteDatabase db) {
   try {
        // get file content
        String sqlCode = getFileContent(mCtx.getResources(), R.raw.db_create);
        // execute code
        for (String sqlStatements : sqlCode.split(";"))
        {
            db.execSQL(sqlStatements);
        }

        Log.v("Creating database done.");
        } catch (IOException e) {
            // Should never happen!
            Log.e("Error reading sql file " + e.getMessage(), e);
            throw new RuntimeException(e);
        } catch (SQLException e) {
            Log.e("Error executing sql code " + e.getMessage(), e);
            throw new RuntimeException(e);
        }

我发现避免这种情况的解决方案是从一个巨大的static final String而不是一个文件中加载sql指令,并且所有突出显示的字符看起来都很好。

但是,有没有比包含所有sql指令的大型static final String属性更优雅的加载sql指令的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-24 00:37:25

我想你的问题出在这行:

代码语言:javascript
复制
return new String(buffer);

您正在将字节数组转换为java.lang.String,但是您没有告诉Java/Android要使用的编码。因此,重音字符的字节没有正确转换,因为使用了错误的编码。

如果使用[String(byte[],<encoding>)](http://developer.android.com/reference/java/lang/String.html#String(byte[],%20java.lang.String%29)构造函数,则可以指定文件的编码,字符将被正确转换。

票数 8
EN

Stack Overflow用户

发布于 2009-12-24 00:36:24

SQL文件解决方案看起来很完美,只是你需要确保文件是以utf8编码保存的,否则所有突出显示的字符都会丢失。如果您不想更改文件的编码,那么需要向新的String(bytes, charset)传递一个额外的参数来定义文件的编码。

最好使用文件资源,而不是静态的最终字符串,以避免将所有不必要的字节加载到内存中。在手机中,你想尽可能节省所有的内存!

票数 4
EN

Stack Overflow用户

发布于 2012-03-19 08:55:32

我使用了一种不同的方法:我在桌面上构建我的sqlite数据库,将其放在assets文件夹中,在android中创建一个空的sqlite db,然后将该db从assets文件夹复制到数据库文件夹中,而不是执行sql语句的加载(这将需要很长时间才能完成)。这是一个巨大的速度提升。注意,您需要先在android中创建一个空数据库,然后才能复制和覆盖它。否则,Android将不允许您在数据库文件夹中写入数据库。在互联网上有几个例子。顺便说一句,如果数据库没有文件扩展名,这种方法似乎工作得最好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1953823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档