Java 将数据从CSV保存到域

Java 将数据从CSV保存到域,java,android,csv,realm,Java,Android,Csv,Realm,我一直在创建一个字典应用程序,所有单词都保存在.csv文件中 当应用程序第一次运行时,此方法应将所有单词保存到领域数据库,但只保存很少的单词 任务java.util.concurrent。FutureTask@286858df从io.realm.internal.async拒绝。RealmThreadPoolExecutor@273caff5[正在运行,池大小=13,活动线程=13,排队任务=100,已完成任务=1] 有没有更好的方法用android发布预填充的Relam数据库, 我有14680

我一直在创建一个字典应用程序,所有单词都保存在.csv文件中
当应用程序第一次运行时,此方法应将所有单词保存到领域数据库,但只保存很少的单词

任务java.util.concurrent。FutureTask@286858df从io.realm.internal.async拒绝。RealmThreadPoolExecutor@273caff5[正在运行,池大小=13,活动线程=13,排队任务=100,已完成任务=1]

有没有更好的方法用android发布预填充的Relam数据库,
我有146800字要保存到数据库时,应用程序是第一次运行,这个方法只保存了几个字,然后给出上面的错误显示

使用1个事务,而不是146800个事务。还可以考虑使用1实例保存域对象,而不是创建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");
        }
    });
<>编辑:您应该考虑使用A,因为<代码> String .SPLIT()/代码>内存密集型。

而不是

while ((line = br.readLine()) != null) {
想想这个

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

您应该在一个事务中运行整个数据库,而不是146800个事务…是的,只是这样做了,但编译时间太长,您知道如何使用realm发送预填充的数据库吗?您可以创建初始数据库并使用应用程序分发它:@phpdroid您检查过此解决方案的速度了吗?我使用了
insert()
,因为它速度更快,并且减少了对象创建计数。但是我认为
String.split()
可能比使用CSV解析器库的性能要差:谢谢,速度现在不重要了!我将创建领域数据库并随应用程序一起发布
final CSVParser parser = new CSVParser(reader, CSVFormat.EXCEL.withHeader());
for (final CSVRecord record : parser) {
    ...