我一直在创建一个字典应用程序,我将所有单词保存在 .csv 文件中
当应用程序第一次运行时,此方法应将所有单词保存到 realm db 但只保存少数。
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();
}
}
}
}
有没有更好的方法来使用 android 发送预填充的 Relam 数据库, 当应用程序第一次运行时,我有 146800 个单词要保存到数据库中,这种方法只保存了几个单词,然后在上面显示错误!
最佳答案
使用 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) {
...
关于java - 将数据从 CSV 保存到 Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38954026/