2016-08-15 13 views
1

に私は.CSVファイル
アプリが最初に実行されている場合、このメソッドは、レルムデシベルにすべての単語を保存するだけで保存すべきではすべての単語を保存した辞書アプリケーションを作成してきましたいくつか。データの保存はCSVからレルム

タスク[email protected]は= [email protected]から拒否[ランニング、プールサイズ= 13、アクティブなスレッド= 13、= 100、完了したタスクをタスクキューに入れられました1]

realm = Realm.getDefaultInstance(); 



    //adding to db satrt 
    if (!(realm.isEmpty())) { 
     Log.v("DB","already there!!"); 
    } else { 
     Log.v("DB","Not Found!!"); 
     String csvFile = "longevity.csv"; 
     BufferedReader br = null; 
     String line = ""; 
     String cvsSplitBy = ","; 

     try { 

      br = new BufferedReader(new InputStreamReader(getAssets().open(csvFile))); 
      while ((line = br.readLine()) != null) { 

       // use comma as separator 
       final String[] oneWord= line.split(cvsSplitBy); 



       realm.executeTransactionAsync(new Realm.Transaction() { 
        @Override 
        public void execute(Realm bgRealm) { 
         Word user = bgRealm.createObject(Word.class); 
         user.setWord(oneWord[1]); 
         user.setMeaning(oneWord[2]); 
         user.setSynonyms(oneWord[3]); 
        } 
       }, new Realm.Transaction.OnSuccess() { 
        @Override 
        public void onSuccess() { 
         Log.v("TAGGED","SAVED"); 
        } 
       }, new Realm.Transaction.OnError() { 
        @Override 
        public void onError(Throwable error) { 
         Log.v("TAGGED","FAILED"); 
        } 
       }); 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

アンドロイドが事前に入力Relamデータベースを出荷するより良い方法は、私はアプリが初めて、エラーを与えるだけでいくつかの単語を保存するこの方法を実行したときに、DBに保存する146800個の言葉を持っている、 あり上のショー!

+0

あなたが代わり146800のトランザクションの1つのトランザクションで全体のことを実行する必要があります考えてみましょう... – EpicPandaForce

+0

はい、まさにそれをやったが、コンパイルするためにあまりにも多くの時間を割いて、あなたは、私がどのようにして領域を持つあらかじめデータベースを出荷することができるか知っていますか? – phpdroid

+0

初期データベースを作成し、アプリと共に配布することができます:https://realm.io/docs/java/1.1.1/api/io/realm/RealmConfiguration.Builder.html#assetFile-android.content.Context- java.lang.String- – geisshirt

答えて

2

146800件のトランザクションの代わりに1件のトランザクションを使用します。また、146800オブジェクトを作成する代わりに、1インスタンスを使用してRealmオブジェクトを保存することも検討してください。

realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm bgRealm) { 
      String csvFile = "longevity.csv"; 
      BufferedReader br = null; 
      String line = ""; 
      String cvsSplitBy = ","; 
      try { 
       br = new BufferedReader(new InputStreamReader(getAssets().open(csvFile))); 
       Word user = new Word(); 
       while((line = br.readLine()) != null) { 
        // use comma as separator 
        final String[] oneWord = line.split(cvsSplitBy); 
        user.setWord(oneWord[1]); 
        user.setMeaning(oneWord[2]); 
        user.setSynonyms(oneWord[3]); 
        bgRealm.insert(user); 
       } 
      } catch(Throwable e) { 
       e.printStackTrace(); 
       throw e; 
      } finally { 
       if(br != null) { 
        try { 
         br.close(); 
        } catch(IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      Log.v("TAGGED", "SAVED"); 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      Log.v("TAGGED", "FAILED"); 
     } 
    }); 

EDIT:String.split()はメモリ集約型であるため、あなたは、CSV parser libraryを使用して検討すべきです。代わりに

while ((line = br.readLine()) != null) { 

が、これは

final CSVParser parser = new CSVParser(reader, CSVFormat.EXCEL.withHeader()); 
for (final CSVRecord record : parser) { 
    ... 
+0

@phpdroidこのソリューションの速度を確認しましたか? 'insert()'を使用しました。これは速く、オブジェクト作成回数を減らしたからです。 – EpicPandaForce

+0

しかし、私は 'String.split()'がCSV-parserライブラリを使うよりパフォーマンスが劣るかもしれないと思っています:https://commons.apache.org/proper/commons-csv/ – EpicPandaForce

+0

ありがとうございました。私はrealm dbを作成し、アプリと共に出荷します。 – phpdroid

関連する問題