【问题标题】:Saving Data from CSV to Realm将数据从 CSV 保存到 Realm
【发布时间】:2016-12-21 14:19:00
【问题描述】:

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

任务 java.util.concurrent.FutureTask@286858df 从 io.realm.internal.async.RealmThreadPoolExecutor@273caff5 被拒绝[正在运行,池大小 = 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();
                }
            }
        }

    }

有没有更好的方法来使用 android 运送预填充的 Relam 数据库, 第一次运行应用程序时,我有 146800 个单词要保存到 db,这种方法只保存几个单词,然后在上面显示错误!

【问题讨论】:

  • 你应该在一个事务中运行整个事情,而不是 146800 个事务...
  • 是的,只是这样做了,但是编译时间太长了,你知道我怎样才能用领域运送预填充的数据库吗?
  • 您可以创建初始数据库并将其与您的应用程序一起分发:realm.io/docs/java/1.1.1/api/io/realm/…

标签: java android csv realm


【解决方案1】:

使用 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) {
    ...

【讨论】:

  • @phpdroid 你检查过这个解决方案的速度吗?我使用了insert(),因为它更快,并且减少了对象创建次数。
  • 但是我认为String.split() 的性能可能不如使用 CSV 解析器库:commons.apache.org/proper/commons-csv
  • 谢谢,现在速度已经不重要了!我将创建领域数据库并随应用一起发布。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 2022-07-06
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多