2016-08-15 149 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数据库与Android更好的办法, 我有146800分的话时保存应用程序正在运行第一次,这种方法只保存几句话然后给错误分贝以上显示!

+0

您应该运行整个事情在一个事务中,而不是146800个交易... – EpicPandaForce

+0

是刚做这一点,但花费过多时间来编译,你知道我怎么能运送prepopulated数据库的领域? – 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

使用1次交易而不是146800次交易。另请考虑使用1个实例保存您的Realm对象,而不是创建146800个对象。

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

编辑:你应该考虑使用CSV parser library,因为String.split()是内存密集型。

代替

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解析器库的性能要低一些:https://commons.apache.org/proper/commons-csv/ – EpicPandaForce

+0

感谢速度现在并不重要!我将创建realm db并随应用程序一起提供。 – phpdroid