有没有办法将领域数据库导出为 CSV/JSON?
Posted
技术标签:
【中文标题】有没有办法将领域数据库导出为 CSV/JSON?【英文标题】:Is there a way to export realm database to CSV/JSON? 【发布时间】:2018-03-24 19:13:52 【问题描述】:我想在 android 中将我的领域数据库导出为 CSV/JSON。领域数据库中是否有一些内置方法可以做到这一点?
有一种 ios 方法可以将领域转换为 CSV link。我想在 Android 中使用类似的方法。
【问题讨论】:
Java 还是 Kotlin?无论如何,没有官方的 api:github.com/realm/realm-java/issues/2880 Java/kotlin 什么都行。 所以我发现我不确定您将如何实现它,因为有像RealmList<OtherRealmModel>
这样的字段并不能真正转换为 CSV
【参考方案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 个参数:有问题的领域对象和 DB 对象模型名称:
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("\\pZ","");
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 对 DB 执行基本相同的过程,但我还必须包含 2 行以在处理该行后删除尾随逗号。每一行都附加到文件和中提琴,CSV 格式很好。
从这里,您可以使用其他现有方法将 CSV 转换为 JSON 和其他任何方法,以及通过 JSON 将信息放回领域。当涉及到主键等更高级的元素时,我不确定,但它可以满足我的特定项目需求。
请原谅任何“糟糕的代码”做法,因为我是 Java/Android 的新手,通常来自“几乎是中级”的 Python 背景,所以希望这是有道理的。
【讨论】:
【参考方案2】:我通过电子邮件收到了 Realm 支持的回复。
很遗憾,我们还没有这个功能。你可以在这里看到它被跟踪:https://github.com/realm/realm-java/issues/2880
您可以使用动态 API 并自己编写脚本来执行类似的功能。
【讨论】:
以上是关于有没有办法将领域数据库导出为 CSV/JSON?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 powerbuilder 应用程序导出为文本?