有没有办法将领域数据库导出为CSV / JSON?

时间:2018-03-24 19:13:53

标签: android database realm

我想在Android中将我的领域数据库导出为CSV / JSON。在领域数据库中是否有一些内置方法可以做到这一点?

有一种iOS方式可以将领域转换为CSV link。我想在Android中使用类似的方法。

2 个答案:

答案 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并自行编写脚本来执行类似功能。