0

私が取り組んでいる電子ブックリーダーアプリにオフライン辞書を実装しようとしています。

プロセスを説明しましょう。辞書は元のアプリの一部ではなく、バックグラウンドでダウンロードされます。元の辞書データは 24MB の長さの json で、後で圧縮すると 6MB に縮小されます。

次に、圧縮された json をダウンロードし、デバイスで抽出します。辞書 json には、DB に保存している約 150,000 個の全体があります。JsonReader を使用して json を順次解析し、DB に各エントリを追加しています。

以下は、json を読み取り、各エントリを解析して DB に保存するためのコードです (自明であることを願っています)。

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