如何用数据预填充Realm数据库?

时间:2018-01-21 10:45:10

标签: react-native realm

我有一个从网上抓取的数据文件,它是使用python脚本生成的 如何将其加载到我的Realm反应本机数据库中? 我偶然发现可以从JSON文件加载而不做任何修改的想法,是否可能,如何做到这一点?

如何在本机中指定文件的路径? 如何解析本地的文件?

更新: 你能否建议我在React Native中使用数据的一般工作流程?我没有找到有用的手册。
我想知道,我应该解析React native(通用脚本)中的文件,在这种情况下如何指定它们的路径,或者我应该在特定平台中使用它们(来自Andriod / iOS项目)?

2 个答案:

答案 0 :(得分:1)

最后,我提出了提供重新填充数据库的有效工作流程 1. 将数据转换为json格式,因为可以使用节点的npm require方法直接导入json文件。 (我有csv格式的文件,并编写了python脚本将其转换为json),所以你的文件应该是这样的:

{"key0": ["property0", "property1"], "key1": ["property0", "property1"]...}

实际上你创建了具有数据库模式的json文件,示例文件将映射到以下模式:

const MyDBSchema = {
    name: 'MyEntity',
    primaryKey: 'key',
    properties: {
      key:  'string',
      property0: 'string',
      property1: 'int',
      property2: 'int',
      property3: 'int'
    }
};

如您所见,我从子文件加载属性:property0,property1,在创建数据库时初始化其他属性。
2. 首次创建数据库:
这包括数据库的生成和选择放置的地方(注意放在哪里,因为这里的选择有限)。
这里的关键要素是我们只创建一次数据库,只有在没有数据库的情况下,我们才使用RNFS模块
我们的算法相当紧张:如果文件存在 - 打开它,否则创建并打开它。

export async function openDB() {
    realm = await Realm.open({
        path: RNFS.DocumentDirectoryPath + '/myDBname.realm',
        schema: [MySchema],

    });
    RNFS.exists(RNFS.DocumentDirectoryPath + '/myDBname.realm').then(exists => {
        if(!exists) {
          createDB(realm);
        }
    });
    return realm;
}

数据库创建在Realm的网页上描述,无论如何这里是我的代码片段,所以你可以看到它如何映射到整体图片:

let entities = require('../../data/myJsonFileForDB');
export function createDB(realm){
try {
    console.log("Creating DB");
    console.log("db path:" + realm.path);
    realm.write(() => {
        for (let entity in entities) {
            let property0 = entities['property0'][0];
            let property1 = parseInt(entities['property0'][1]);
            realm.create('myEntity', 
              {
                property0: property0,
                property1: property1,
                property2: 0,
                property3: 0,
              }, true);
          }
        });
    } catch (error) {
      console.log(error)
        console.log("Error on creation");
    }
};

答案 1 :(得分:0)

这是来自领域网站。看起来你只需将你拥有的任何内容转换为适用于你正在做的事情的JSON对象,然后将其定义为一个模式并从中创建一个新的Realm对象。

const Realm = require('realm');

class Person {}
Person.schema = {
    name: 'Person',
    primaryKey: 'name',
    properties: {
        name: 'string',
        age: {type: 'int', default: 0},
    },
};

const realm = new Realm({schema: [Person]});

// Query
let people = realm.objects('Person', 'age >= 17');
people.length // => 0

// Write
realm.write(() => {
    savedPerson = realm.create('Person', {
        name: 'Hal Incandenza',
        age: 17,
    });
});

// Queries are updated in real-time
people.length // => 1
let pups = realm.objects('Dog').filtered('age < 2');