将数据从CSV保存到领域 [英] Saving Data from CSV to Realm

查看:239
本文介绍了将数据从CSV保存到领域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个字典应用程序,我有所有的话保存在 .csv 文件中

当应用程序运行时第一次,这种方法应该保存所有的字到领域db但只保存少数。


任务java.util.concurrent.FutureTask@286858df从io.realm.internal.async.RealmThreadPoolExecutor @ 273caff5 [Running,pool size = 13,active threads = 13,queued tasks = 100,completed tasks = 1]




  realm = Realm.getDefaultInstance(); 



//添加到db satrt
if(!(realm.isEmpty())){
Log.v(DB 已经在那了!!);
} 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){

//使用逗号作为分隔符
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 ];
}
},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 dataBase与android,
i有146800个字被保存到db当应用程序运行时第一次,此方法只保存几个字,然后给出错误显示上面!

解决方案

使用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){
//使用逗号作为分隔符
final String [] oneWord = line.split(cvsSplitBy) ;
user.setWord(oneWord [1]);
user.setMeaning(oneWord [2]);
user.setSynonyms(oneWord [3]);
bgRealm.insert (用户);
}
} catch(Throwable e){
e.printStackTrace();
throw e;
} finally {
if(br!= null){
try {
br.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
}
},新Realm.Transaction.OnSuccess(){
@Override
public void onSuccess {
Log.v(TAGGED,SAVED);
}
},新的Realm.Transaction.OnError(){
@Override
public void onError(Throwable error){
Log.v(TAGGED, FAILED);
}
});

编辑:您应该考虑使用 CSV解析器库,因为 String.split()是内存密集型。

而不是

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

考虑这个

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


I have been creating a Dictionary App i have all words saved in the .csv file
when app is run First Time, this method should save all the words to realm db but saving only few.

Task java.util.concurrent.FutureTask@286858df rejected from io.realm.internal.async.RealmThreadPoolExecutor@273caff5[Running, pool size = 13, active threads = 13, queued tasks = 100, completed tasks = 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();
                }
            }
        }

    }

is there A Better way to ship prepopulated Relam dataBase with android, i have 146800 words to be saved to db when app is run First Time, this method saving only few words then giving error show above!

解决方案

Use 1 transaction instead of 146800 transactions. Also consider using 1 instance to save your Realm object, instead of creating 146800 objects.

    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: You should consider using a CSV parser library, because String.split() is memory-intensive.

Instead of

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

Consider this

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

这篇关于将数据从CSV保存到领域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆