我想在Android中将我的领域数据库导出为CSV / JSON。在领域数据库中是否有一些内置方法可以做到这一点?
有一种iOS方式可以将领域转换为CSV link。我想在Android中使用类似的方法。
答案 0 :(得分:1)
我能够在我的项目中拼凑以下解决方案:
// Grab all data from the DB in question (TaskDB):
RealmResults<TaskDB> resultsDB = realm.where(TaskDB.class).findAll();
// Here we need to put in header fields
String dataP = null;
String header = DataExport.grabHeader(realm, "TaskDB");
// We write the header to file
savBak(header);
// Now we write all the data corresponding to the fields grabbed above:
for (TaskDB taskitems: resultsDB) {
dataP = taskitems.toString();
// We process the data obtained and add commas and formatting:
dataP = dataProcess(dataP);
// Workaround to remove the last comma from final string
int total = dataP.length() - 1;
dataP = dataP.substring(0,total);
// We write the data to file
savBak(dataP);
}
我将尽一切可能解释它的作用,并包括所有对应的代码(均参考第一个代码块)。
首先,我使用在单独的类(DataExport.grabHeader)中编写的以下方法来获取标头。它包含2个参数:有问题的领域对象和数据库对象模型名称:
public static String grabHeader(Realm realm, String model){
final RealmSchema schema = realm.getSchema();
final RealmObjectSchema testSchema = schema.get(model);
final String header = testSchema.getFieldNames().toString();
String dataProcessed = new String();
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(header);
while(m.find()) {
dataProcessed += m.group(1).trim().replaceAll("\\p{Z}","");
}
return dataProcessed;
在grabHeader中,我应用了一些正则表达式魔术,并吐出了一个字符串,该字符串将用作带有适当逗号的标题(String dataProcessed)。 在这种情况下,获得所需的数据后,我使用了另一种方法(savBak)将信息写入具有1个字符串参数的文件:
@Override
public void savBak(String data){
FileOutputStream fos = null;
try {
fos = openFileOutput(FILE_NAME, MODE_PRIVATE | MODE_APPEND);
fos.write(data.getBytes());
fos.write("\n".getBytes());
Log.d("tester", "saved to: " + getFilesDir() + "/" + FILE_NAME);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
“ savBak”方法将信息写入变量中指定的FILE_NAME中,并且我们拥有标题信息。在写完头文件之后,我们使用forloop对数据库进行基本相同的处理,但是在处理该行之后,我还必须包括2行以删除尾部逗号。每行都附加到文件和CSV格式的中提琴之后。
从这里开始,您可以使用其他现有方法将CSV转换为JSON,以及通过JSON将信息放回领域。当涉及到诸如主键之类的更高级元素时,我不确定,但是它可以满足我的特定项目需求。
请原谅任何“错误代码”的做法,因为我一般都是Java或Android的新手,而我来自“几乎没有中级” Python背景,所以希望这是有道理的。
答案 1 :(得分:0)
我通过电子邮件得到了Realm支持的回复。
很遗憾,我们还没有此功能。您可以在此处看到它:https://github.com/realm/realm-java/issues/2880
您可以使用动态API并自行编写脚本来执行类似功能。