0

我正在尝试在我正在开发的电子书阅读器应用程序中实现离线词典。

让我解释一下这个过程。该词典不是原始应用程序的一部分,而是会在后台下载。原始字典数据是一个 24MB 长的 json,后来压缩到 6MB。

然后我下载压缩的 json 并将其提取到设备上。字典 json 有大约 150,000 个整数,我保存在数据库中。我正在使用 JsonReader 依次解析 json,在 DB 中添加每个条目。

下面是读取 json、解析每个条目并将其保存在数据库中的代码(我希望它是自我解释的)

public void readFile() throws IOException {

    File jsonInputFile = new File(DownloadClassHelper.getOfflineDictionaryDownloadPath());

    InputStream inputStream = new FileInputStream(jsonInputFile);
    JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));

    try {
        readArray(reader);
    } finally {
        reader.close();
    }
}

public void readArray(JsonReader reader) throws IOException {

    reader.beginArray();
    while (reader.hasNext()) {
        readObject(reader);
    }
    reader.endArray();
}

public void readObject(JsonReader reader) throws IOException {

    String word = null;

    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("word")) {
            word = reader.nextString();
        } else if (name.equals("meanings") && reader.peek() != JsonToken.NULL) {
            readMeaningsArray(word, reader);
        } else {
            reader.skipValue();
        }
    }
    reader.endObject();
}

public void readMeaningsArray(String word, JsonReader reader) throws IOException {

    reader.beginArray();
    while (reader.hasNext()) {
        readMeaningObject(word, reader);
    }
    reader.endArray();
}

public void readMeaningObject(String word, JsonReader reader) throws IOException {

    String definition = null, pos = null;

    reader.beginObject();
    while (reader.hasNext()) {
        String name = reader.nextName();

        if (name.equals("definition")) {
            definition = reader.nextString();
        } else if (name.equals("pos")) {
            pos = reader.nextString();
        } else {
            reader.skipValue();
        }

    }
    reader.endObject();

    addWord(word, definition, pos);

    Log.d(TAG, word + " | " + definition + " | " + pos);
}

/**
 * Add a word to the dictionary.
 * @return true or false if failed
 */
public boolean addWord(String word, String definition, String pos) {

    ContentValues initialValues = new ContentValues();
    initialValues.put(TableDictionary.COLUMN_WORD, word);
    initialValues.put(TableDictionary.COLUMN_DEFINITION, definition);
    initialValues.put(TableDictionary.COLUMN_POS, pos);

    return CPWrapper.insert(TableDictionary.TABLE_NAME, initialValues);
}

我目前的方法面临性能问题,因为解析整个 json 需要将近 30 分钟。

在 Android 应用中实现离线字典的理想方法是什么?我需要改变我目前的方法吗?如果是,那么我应该如何在android中理想地实现这样的系统。

非常欢迎任何建议/提示。

4

1 回答 1

0

最好的方法是为您的应用程序使用预填充的数据库。因此,您可以将数据库文件添加到资产文件夹中的 apk 中,而不是下载 JSON 文件。您可以使用Android SQLiteAssetHelper

于 2017-08-22T17:15:19.027 回答