0

J'essaie de mettre en œuvre un dictionnaire hors ligne dans une application de lecture d'ebook sur laquelle je travaille. Laissez-moi vous expliquer le processus.Lenteur de performance sur Android mettant en œuvre un dictionnaire hors ligne utilisant JsonReader

Le dictionnaire ne fait pas partie de l'application d'origine, sera plutôt téléchargé en arrière-plan. Les données du dictionnaire original sont un json de 24 Mo de long qui est ensuite réduit à 6 Mo lors de la compression. Je télécharge ensuite le fichier json compressé et l'extrait sur l'appareil. Le dictionnaire json a environ 150 000 entrées que je sauvegarde dans une base de données. J'utilise JsonReader pour analyser le json ensuite, en ajoutant chaque entrée dans DB.

est Ci-dessous le code pour lire le JSON, l'analyse syntaxique chaque entrée et l'enregistrer dans une base de données (je l'espère est explicite)

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

Je suis confronté à des problèmes de performances avec mon approche actuelle car elle prend près à 30 minutes pour analyser tout le json.

Quelle est la méthode idéale pour implémenter le dictionnaire hors ligne dans les applications Android? Ai-je besoin de changer d'approche? Si oui, alors comment dois-je mettre en œuvre un tel système idéal dans Android.

Toutes les recommandations/conseils sont les bienvenus.

Répondre

0

La meilleure façon d'utiliser une base de données pré-remplie pour votre application. Ainsi, au lieu de télécharger le fichier JSON, vous pouvez ajouter le fichier de base de données à votre apk dans le dossier assets. Vous pouvez utiliser Android SQLiteAssetHelper

+0

Ce serait ajouter à la taille de l'application. Ajout de 6mb plus à l'application de base rendrait énorme pour moi. Avez-vous une autre idée en tête? –

+0

Vous pouvez inclure la base de données initiale dans l'application. Ensuite, téléchargez le fichier de base de données complet en ligne et remplacez le fichier original. –