Realm JavaScript
<p>★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★<br>➤微信公众号:山青咏芝(shanqingyongzhi)<br>➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)<br>➤GitHub地址:https://github.com/strengthen/LeetCode<br>➤原文地址:https://www.cnblogs.com/strengthen/p/11166081.html <br>➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。<br>➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!<br>★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★</p><p><span style="color: rgba(255, 0, 0, 1); font-size: 18pt"><span style="color: rgba(255, 0, 0, 1)">热烈欢迎,请直接点击!!!</span></span></p>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 18pt"><span style="color: rgba(255, 0, 0, 1)">进入博主App Store主页,下载使用各个作品!!!</span></span></p>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 18pt"><span style="color: rgba(255, 0, 0, 1)">注:博主将坚持每月上线一个新app!!!</span></span></p>
<h2><span>入门</span></h2>
<h3 id="installation"><span>安装</span></h3>
<p><span>按照下面的安装说明通过</span>npm<span><span>安装Realm JavaScript </span><span>,或者</span></span>在GitHub上<span><span>查看源代码</span><span>。</span></span></p>
<ul class="nav nav-tabs getting-started">
<li class="active"><span>反应原生</span></li>
<li><span>Node.js的</span></li>
</ul>
<div class="tab-content getting-started">
<div id="react-install" class="tab-pane active">
<p>先决条件</p>
<ul>
<li><span><span>确保您的环境已设置为运行React Native应用程序。</span><span>按照</span></span>React Native说明<span>开始使用。</span></li>
<li><span>使用Realm的应用可以同时针对iOS和Android。</span></li>
<li><span>支持React Native 0.31.0及更高版本。</span></li>
</ul>
<p>安装</p>
<ul>
<li>
<p><span>创建一个新的React Native项目:</span></p>
<pre class="highlight shell"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>react-native init <project-name></code></pre>
</li>
<li>
<p><span>将目录更改为新项目(</span><code>cd <project-name></code><span>)并添加</span><code>realm</code><span>依赖项:</span></p>
<pre class="highlight shell"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>npm install --save realm</code></pre>
</li>
<li>
<p><span>接下来,将项目链接到本</span><code>realm</code><span>机模块。</span></p>
<pre class="highlight shell"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>react-native link realm</code></pre>
</li>
</ul>
<p><em>Android警告:</em><span>根据版本的不同,</span><code>react-native link</code><span>可能会生成无效配置,正确更新Gradle(</span><code>android/settings.gradle</code><span>和</span><code>android/app/build.gradle</code><span><span>)但无法添加Realm模块。</span><span>确认</span></span><code>react-native link</code><span><span>已添加Realm模块; </span><span>如果没有,请使用以下步骤手动链接到库:</span></span></p>
<ol>
<li>
<p><span>将以下行添加到</span><code>android/settings.gradle</code><span>:</span></p>
<pre class="highlight groovy"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="n">include <span class="s1">':realm'
<span class="n">project<span class="o">(<span class="s1">':realm'<span class="o">).<span class="na">projectDir <span class="o">= <span class="k">new <span class="n">File<span class="o">(<span class="n">rootProject<span class="o">.<span class="na">projectDir<span class="o">, <span class="s1">'../node_modules/realm/android'<span class="o">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</li>
<li>
<p><span>将Realm添加到依赖项中</span><code>android/app/build.gradle</code><span>:</span></p>
<pre class="highlight groovy"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="c1">// When using Android Gradle plugin 3.0 or higher
<span class="n">dependencies <span class="o">{
<span class="n">implementation <span class="nf">project<span class="o">(<span class="s1">':realm'<span class="o">)
<span class="o">}
<span class="c1">// When using Android Gradle plugin lower than 3.0
<span class="n">dependencies <span class="o">{
<span class="n">compile <span class="nf">project<span class="o">(<span class="s1">':realm'<span class="o">)
<span class="o">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</li>
<li>
<p><span>添加导入并链接包</span><code>MainApplication.java</code><span>:</span></p>
<pre class="highlight java"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kn">import <span class="nn">io.realm.react.RealmReactPackage<span class="o">; <span class="c1">// add this import
<span class="kd">public <span class="kd">class <span class="nc">MainApplication <span class="kd">extends <span class="n">Application <span class="kd">implements <span class="n">ReactApplication <span class="o">{
<span class="nd">@Override
<span class="kd">protected <span class="n">List<span class="o"><<span class="n">ReactPackage<span class="o">> <span class="nf">getPackages<span class="o">() <span class="o">{
<span class="k">return <span class="n">Arrays<span class="o">.<<span class="n">ReactPackage<span class="o">><span class="n">asList<span class="o">(
<span class="k">new <span class="nf">MainReactPackage<span class="o">(),
<span class="k">new <span class="nf">RealmReactPackage<span class="o">() <span class="c1">// add this line
<span class="o">);
<span class="o">}
<span class="o">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</li>
</ol>
<p><span><span>你现在准备好了。</span><span>要查看Realm的运行情况,请将</span></span><code>class <project-name></code><span><span>以下内容</span><span>替换</span><span>为以下内容</span></span><code>App.js</code><span>:</span></p>
<pre class="highlight plaintext"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>const Realm = require('realm');
class <project-name> extends Component {
constructor(props) {
super(props);
this.state = { realm: null };
}
componentWillMount() {
Realm.open({
schema: [{name: 'Dog', properties: {name: 'string'}}]
}).then(realm => {
realm.write(() => {
realm.create('Dog', {name: 'Rex'});
});
this.setState({ realm });
});
}
render() {
const info = this.state.realm
? 'Number of dogs in this Realm: ' + this.state.realm.objects('Dog').length
: 'Loading...';
return (
<View style={styles.container}>
<Text style={styles.welcome}>
{info}
</Text>
</View>
);
}
}</code></pre>
<p><span>然后,您可以在设备和模拟器中运行您的应用程序。</span></p>
<p><span>请注意,</span>世博会不支持Realm<span>,</span><code>create-react-native-app</code><span>不起作用。</span></p>
</div>
</div>
<h4 id="introduction"><span>介绍</span></h4>
<p><span><span>Realm JavaScript使您能够以安全,持久和快速的方式有效地编写应用程序的模型层。</span><span>它旨在与</span></span>React Native<span>和</span>Node.js一起使用<span>。</span></p>
<p><span>这是一个简单的例子:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">Realm <span class="o">= <span class="nx">require<span class="p">(<span class="s1">'realm'<span class="p">);
<span class="c1">// Define your models and their properties
<span class="kr">const <span class="nx">CarSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">make<span class="p">:<span class="s1">'string'<span class="p">,
<span class="na">model<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">miles<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'int'<span class="p">, <span class="na">default<span class="p">: <span class="mi">0<span class="p">},
<span class="p">}
<span class="p">};
<span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">birthday<span class="p">: <span class="s1">'date'<span class="p">,
<span class="na">cars<span class="p">: <span class="s1">'Car[]'<span class="p">,
<span class="na">picture<span class="p">:<span class="s1">'data?' <span class="c1">// optional property
<span class="p">}
<span class="p">};
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarSchema<span class="p">, <span class="nx">PersonSchema<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="c1">// Create Realm objects and write to local storage
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kr">const <span class="nx">myCar <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Car'<span class="p">, <span class="p">{
<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">,
<span class="na">model<span class="p">: <span class="s1">'Civic'<span class="p">,
<span class="na">miles<span class="p">: <span class="mi">1000<span class="p">,
<span class="p">});
<span class="nx">myCar<span class="p">.<span class="nx">miles <span class="o">+= <span class="mi">20<span class="p">; <span class="c1">// Update a property value
<span class="p">});
<span class="c1">// Query Realm for all cars with a high mileage
<span class="kr">const <span class="nx">cars <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'miles > 1000'<span class="p">);
<span class="c1">// Will return a Results object with our 1 car
<span class="nx">cars<span class="p">.<span class="nx">length <span class="c1">// => 1
<span class="c1">// Add another car
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kr">const <span class="nx">myCar <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Car'<span class="p">, <span class="p">{
<span class="na">make<span class="p">: <span class="s1">'Ford'<span class="p">,
<span class="na">model<span class="p">: <span class="s1">'Focus'<span class="p">,
<span class="na">miles<span class="p">: <span class="mi">2000<span class="p">,
<span class="p">});
<span class="p">});
<span class="c1">// Query results are updated in realtime
<span class="nx">cars<span class="p">.<span class="nx">length <span class="c1">// => 2
<span class="p">})
<span class="p">.<span class="k">catch<span class="p">(<span class="nx">error <span class="o">=> <span class="p">{
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="nx">error<span class="p">);
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>请注意,如果要将Realm用于服务器端/节点,则可以在</span>Realm Object Server文档中<span><span>找到其他信息</span><span>。</span></span></p>
<h3 id="realm-studio"><span>Realm Studio</span></h3>
<p>Realm Studio<span><span>是我们的首选开发人员工具,可以轻松管理Realm数据库和Realm平台。</span><span>使用</span></span>Realm Studio<span><span>,您可以打开和编辑本地和同步的域,并管理任何Realm Object Server实例。</span><span>它支持Mac,Windows和Linux。</span></span></p>
<p><img src="https://realm.io/assets/img/docs/realm-studio.png" alt="Realm Studio" class="img-responsive img-rounded" style="display: block; margin-left: auto; margin-right: auto"></p>
<div class="col-xs-12 col-sm-6 col-md-4 text-center download-icons">
<p style="text-align: center"><img src="https://realm.io/assets/svg/products/realm-studio/apple.svg" alt="" class="col-xs-12 col-sm-6 col-sm-push-3 col-md-4 col-md-push-4"><button class="btn btn-indigo col-xs-12"><span><span>下载适用于Mac</span></span></button></p>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 text-center download-icons" style="text-align: center">
<p><img src="https://realm.io/assets/svg/products/realm-studio/linux.svg" alt="" class="col-xs-12 col-sm-6 col-sm-push-3 col-md-4 col-md-push-4"><button class="btn btn-indigo col-xs-12"><span><span>下载适用于Linux</span></span></button></p>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 text-center download-icons">
<p style="text-align: center"><img src="https://realm.io/assets/svg/products/realm-studio/windows.svg" alt="" class="col-xs-12 col-sm-6 col-sm-push-3 col-md-4 col-md-push-4"><button class="btn btn-indigo col-xs-12"><span><span>下载适用于Windows</span></span></button></p>
</div>
<h2><span>三界</span></h2>
<h3 id="opening-realms"><span>开放的领域</span></h3>
<p><span>只需</span><code>open</code><span>在</span><code>Realm</code><span><span>类</span><span>上</span><span>调用静态</span><span>方法</span><span>即可打开Realm </span><span>。</span><span>传递配置对象。</span><span>我们已经看到这已经在示例中使用了包含</span></span><code>schema</code><span><span>密钥</span><span>的配置对象</span><span>:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="c1">// Get the default Realm with support for our objects
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">Car<span class="p">, <span class="nx">Person<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="c1">// ...use the realm instance here
<span class="p">})
<span class="p">.<span class="k">catch<span class="p">(<span class="nx">error <span class="o">=> <span class="p">{
<span class="c1">// Handle the error here if something went wrong
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>有关配置对象的完整详细信息,请参阅API参考以获取</span>配置<span><span>。</span><span>除此之外</span></span><code>schema</code><span><span>,</span><span>该对象的一些更常见的键</span><span>包括:</span></span></p>
<ul>
<li><code>path</code><span><span>:指定</span><span>另一个Realm</span><span>的路径</span></span></li>
<li><code>migration</code><span>:</span>迁移功能</li>
<li><code>sync</code><span>:一个</span>同步对象<span>,用于打开与Realm Object Server同步的Realm</span></li>
<li><code>inMemory</code><span><span>:Realm将在内存中打开,并且对象不会被持久化; </span><span>一旦最后一个Realm实例关闭,所有对象都会消失</span></span></li>
<li><code>deleteRealmIfMigrationNeeded</code><span><span>:如果需要迁移,删除领域; </span><span>这在开发中很有用,因为数据模型可能经常更改</span></span></li>
</ul>
<h3 id="the-default-realm"><span>默认领域</span></h3>
<p><span><span>您可能已经注意到在前面的所有示例中都省略了path参数。</span><span>在这种情况下,使用默认的Realm路径。</span><span>您可以使用</span></span><code>Realm.defaultPath</code><span><span>全局属性</span><span>访问和更改默认的Realm路径</span><span>。</span></span></p>
<h3 id="opening-a-synchronized-realm"><span>打开同步领域</span></h3>
<div class="alert alert-info">
<p><span>您是否希望使用Realm Mobile Platform同步所有Realm数据库?</span><span>所有与同步相关的文档已移至我们的平台文档中</span></p>
</div>
<h3 id="other-realms"><span>其他领域</span></h3>
<p><span><span>在不同位置持有多个领域有时很有用。</span><span>例如,除了主Realm之外,您可能希望将一些数据与应用程序捆绑在Realm文件中。</span><span>您可以通过</span></span><code>path</code><span><span>在初始化领域时</span><span>指定</span><span>参数</span><span>来完成此操作</span><span>。</span><span>所有路径都相对于应用程序的可写文档目录:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="c1">// Open a realm at another path
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({
<span class="na">path<span class="p">: <span class="s1">'anotherRealm.realm'<span class="p">,
<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarSchema<span class="p">]
<span class="p">}).<span class="nx">then<span class="p">(<span class="cm">/* ... */<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="schema-version"><span>架构版本</span></h3>
<p><span>打开Realm时可用的另一个选项是</span><code>schemaVersion</code><span><span>属性。</span><span>省略时,</span></span><code>schemaVersion</code><span>属性默认为</span><code>0</code><span><span>。</span><span>您需要指定</span></span><code>schemaVersion</code><span><span>何时使用包含与先前规范不同的对象的模式初始化现有Realm。</span><span>如果架构已更新且架构未更新,</span></span><code>schemaVersion</code><span>则会引发异常。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'
<span class="p">}
<span class="p">};
<span class="c1">// schemaVersion defaults to 0
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">PersonSchema<span class="p">]});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>如果你稍后再做这样的事情:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">UpdatedPersonSchema <span class="o">= <span class="p">{
<span class="c1">// The schema name is the same, so previous `Person` object
<span class="c1">// in the Realm will be updated
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">dog<span class="p">:<span class="s1">'Dog' <span class="c1">// new property
<span class="p">}
<span class="p">};
<span class="c1">// this will throw because the schema has changed
<span class="c1">// and `schemaVersion` is not specified
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">UpdatedPersonSchema<span class="p">]});
<span class="c1">// this will succeed and update the Realm to the new schema
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">UpdatedPersonSchema<span class="p">], <span class="na">schemaVersion<span class="p">: <span class="mi">1<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>如果要检索Realm的当前架构版本,可以使用该</span><code>Realm.schemaVersion</code><span>方法执行此操作。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">currentVersion <span class="o">= <span class="nx">Realm<span class="p">.<span class="nx">schemaVersion<span class="p">(<span class="nx">Realm<span class="p">.<span class="nx">defaultPath<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="synchronously-opening-realms"><span>同步开放的领域</span></h3>
<p><span><span>您可以通过简单地调用构造函数并将配置对象传递给它来创建领域实例。</span><span>通常不推荐这样做,因为它会阻塞并且可能是一个耗时的操作,特别是如果</span><span>要运行</span></span>迁移<span>或者域</span>同步<span>并且您不希望在数据完全下载之前冒险修改数据。</span></p>
<p><span>如果您仍想这样做,模式很简单:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">realm <span class="o">= <span class="k">new <span class="nx">Realm<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">PersonSchema<span class="p">]});
<span class="c1">// You can now access the realm instance.
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(<span class="cm">/* ... */<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2><span>楷模</span></h2>
<p><span><span>领域数据模型由初始化期间传递到Realm的架构信息定义。</span><span>对象的模式由对象</span></span><code>name</code><span><span>和一组属性组成。</span><span>每个属性具有名称和由或包含属性的类型的字符串,或与对象描述</span></span><code>name</code><span>,</span><code>type</code><span>,</span><code>objectType</code><span>,</span><code>optional</code><span>,</span><code>default</code><span>,和</span><code>indexed</code><span>字段。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">Realm <span class="o">= <span class="nx">require<span class="p">(<span class="s1">'realm'<span class="p">);
<span class="kr">const <span class="nx">CarSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">make<span class="p">:<span class="s1">'string'<span class="p">,
<span class="na">model<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">miles<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'int'<span class="p">, <span class="na">default<span class="p">: <span class="mi">0<span class="p">},
<span class="p">}
<span class="p">};
<span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">birthday<span class="p">: <span class="s1">'date'<span class="p">,
<span class="na">cars<span class="p">: <span class="s1">'Car[]'
<span class="na">picture<span class="p">:<span class="s1">'data?'<span class="p">, <span class="c1">// optional property
<span class="p">}
<span class="p">};
<span class="c1">// Initialize a Realm with Car and Person models
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarSchema<span class="p">, <span class="nx">PersonSchema<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="c1">// ... use the realm instance to read and modify data
<span class="p">})</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="classes"><span>类</span></h3>
<div class="alert alert-warning">
<p><span><span>此时,通过类定义模型的支持是有限的。</span><span>它在React Native中工作,但在Node中不工作。</span></span></p>
</div>
<p><span>如果要使用ES2015类(并且可能希望继承现有功能),则只需在构造函数上定义模式:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">class <span class="nx">Person <span class="p">{
<span class="nx">get <span class="nx">fullName<span class="p">() <span class="p">{
<span class="k">return <span class="k">this<span class="p">.<span class="nx">firstName <span class="o">+ <span class="s1">' ' <span class="o">+ <span class="k">this<span class="p">.<span class="nx">lastName<span class="p">;
<span class="p">}
<span class="p">}
<span class="nx">Person<span class="p">.<span class="nx">schema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">firstName<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">lastName<span class="p">: <span class="s1">'string'
<span class="p">}
<span class="p">};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>您现在可以将类本身传递给</span><code>schema</code><span><span>打开配置</span><span>的</span><span>属性:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">Person<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">( <span class="cm">/* ... */ <span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>您可以一直访问属性:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kr">const <span class="nx">john <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{
<span class="na">firstName<span class="p">: <span class="s1">'John'<span class="p">,
<span class="na">lastName<span class="p">: <span class="s1">'Smith'
<span class="p">});
<span class="nx">john<span class="p">.<span class="nx">lastName <span class="o">= <span class="s1">'Peterson'<span class="p">;
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="nx">john<span class="p">.<span class="nx">fullName<span class="p">); <span class="c1">// -> 'John Peterson'
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="supported-types"><span>支持的类型</span></h3>
<p><span>域支持下列基本类型:</span><code>bool</code><span>,</span><code>int</code><span>,</span><code>float</code><span>,</span><code>double</code><span>,</span><code>string</code><span>,</span><code>data</code><span>,和</span><code>date</code><span>。</span></p>
<ul>
<li><code>bool</code><span>属性映射到JavaScript </span><code>boolean</code><span>值</span></li>
<li><code>int</code><span>,, </span><code>float</code><span>和</span><code>double</code><span>属性映射到JavaScript </span><code>number</code><span><span>值。</span><span>内部'int'和'double'存储为64位,而</span></span><code>float</code><span>存储为32位。</span></li>
<li><code>string</code><span> 属性映射到 </span><code>string</code></li>
<li><code>data</code><span> 属性映射到 </span><code>ArrayBuffer</code></li>
<li><code>date</code><span> 属性映射到 </span><code>Date</code></li>
</ul>
<p><span>将基本属性指定为速记时,您可以仅指定类型,而不必指定具有单个条目的字典:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">CarSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="c1">// The following property types are equivalent
<span class="na">make<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'string'<span class="p">},
<span class="na">model<span class="p">: <span class="s1">'string'<span class="p">,
<span class="p">}
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 id="optional-properties"><span>可选属性</span></h4>
<p><span>默认情况下,基本类型是非可选的,不支持存储</span><code>null</code><span>或</span><code>undefined</code><span><span>。</span><span>通过</span></span><code>optional</code><span><span>在属性定义中</span><span>指定</span><span>指示符或使用简写语法,通过</span></span><code>?</code><span><span>在类型名称后</span><span>附加a </span><span>,</span><span>可以使属性成为可选</span><span>:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">realName<span class="p">: <span class="s1">'string'<span class="p">, <span class="c1">// required property
<span class="na">displayName<span class="p">: <span class="s1">'string?'<span class="p">, <span class="c1">// optional property
<span class="na">birthday<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'date'<span class="p">, <span class="na">optional<span class="p">: <span class="kc">true<span class="p">}, <span class="c1">// optional property
<span class="p">}
<span class="p">};
<span class="kd">let <span class="nx">realm <span class="o">= <span class="k">new <span class="nx">Realm<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">PersonSchema<span class="p">, <span class="nx">CarSchema<span class="p">]});
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="c1">// optional properties can be set to null or undefined at creation
<span class="kd">let <span class="nx">charlie <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{
<span class="na">realName<span class="p">: <span class="s1">'Charlie'<span class="p">,
<span class="na">displayName<span class="p">: <span class="kc">null<span class="p">, <span class="c1">// could also be omitted entirely
<span class="na">birthday<span class="p">: <span class="k">new <span class="nb">Date<span class="p">(<span class="mi">1995<span class="p">, <span class="mi">11<span class="p">, <span class="mi">25<span class="p">),
<span class="p">});
<span class="c1">// optional properties can be set to `null`, `undefined`,
<span class="c1">// or to a new non-null value
<span class="nx">charlie<span class="p">.<span class="nx">birthday <span class="o">= <span class="kc">undefined<span class="p">;
<span class="nx">charlie<span class="p">.<span class="nx">displayName <span class="o">= <span class="s1">'Charles'<span class="p">;
<span class="c1">// Setting a non-optional property to null will throw `TypeError`
<span class="c1">// charlie.realName = null;
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 id="list-properties"><span>列表属性</span></h4>
<p><span><span>除了存储单个值之外,还可以将属性声明为任何支持的基本类型的列表。</span><span>这是通过附加</span></span><code>[]</code><span><span>类型名称来</span><span>完成的</span><span>:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">testScores<span class="p">: <span class="s1">'double?[]'
<span class="p">}
<span class="p">};
<span class="kd">let <span class="nx">realm <span class="o">= <span class="k">new <span class="nx">Realm<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">PersonSchema<span class="p">, <span class="nx">CarSchema<span class="p">]});
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kd">let <span class="nx">charlie <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Charlie'<span class="p">,
<span class="na">testScores<span class="p">: <span class="p">[<span class="mf">100.0<span class="p">]
<span class="p">});
<span class="c1">// Charlie had an excused absense for the second test and was allowed to skip it
<span class="nx">charlie<span class="p">.<span class="nx">testScores<span class="p">.<span class="nx">push<span class="p">(<span class="kc">null<span class="p">);
<span class="c1">// And then he didn't do so well on the third test
<span class="nx">charlie<span class="p">.<span class="nx">testScores<span class="p">.<span class="nx">push<span class="p">(<span class="mf">70.0<span class="p">);
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>访问列表属性时,将</span><code>List</code><span><span>返回</span><span>一个</span><span>对象。</span></span><code>List</code><span><span>具有与常规JavaScript数组非常相似的方法。</span><span>最大的区别在于对a所做的任何更改都会</span></span><code>List</code><span>自动保存到底层Realm,因此它们只能在</span>写入事务中<span><span>进行修改</span><span>。</span><span>此外,</span></span><code>List</code><span>s属于从中获取的基础对象 - 您只能</span><code>List</code><span><span>通过从拥有对象访问属性来</span><span>获取</span><span>实例,并且无法手动创建它们。</span></span></p>
<p><span>虽然list属性中的值可以是可选的,但list属性本身不能。</span><code>optional</code><span>使用longhand语法(</span><code>values: {type: 'int[]', optional: true}</code><span><span>)</span><span>指定list属性</span><span>将使列表中的值可选。</span></span></p>
<h3 id="relationships"><span>关系</span></h3>
<h4 id="to-one-relationships"><span>一对一的关系</span></h4>
<p><span>对于一对一关系,您可以将</span><code>name</code><span><span>要引用的对象模式</span><span>的</span><span>属性</span><span>指定</span><span>为属性的类型:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="c1">// The following property definitions are equivalent
<span class="na">car<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'Car'<span class="p">},
<span class="na">van<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="p">}
<span class="p">};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>使用对象属性时,需要确保所有引用的类型都存在于用于打开Realm的模式中:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="c1">// CarSchema is needed since PersonSchema contains properties of type 'Car'
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarSchema<span class="p">, <span class="nx">PersonSchema<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">(<span class="cm">/* ... */<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>访问对象属性时,可以使用常规属性语法访问嵌套属性:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kr">const <span class="nx">nameString <span class="o">= <span class="nx">person<span class="p">.<span class="nx">car<span class="p">.<span class="nx">name<span class="p">;
<span class="nx">person<span class="p">.<span class="nx">car<span class="p">.<span class="nx">miles <span class="o">= <span class="mi">1100<span class="p">;
<span class="c1">// create a new Car by setting the property to an object
<span class="c1">// with all of the required fields
<span class="nx">person<span class="p">.<span class="nx">van <span class="o">= <span class="p">{<span class="na">make<span class="p">: <span class="s1">'Ford'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Transit'<span class="p">};
<span class="c1">// set both properties to the same car instance
<span class="nx">person<span class="p">.<span class="nx">car <span class="o">= <span class="nx">person<span class="p">.<span class="nx">van<span class="p">;
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>Realm中的对象属性</span><em>始终是</em><span><span>可选的,不必明确指定,也不能使其成为必需</span><span>属性</span><span>。</span></span></p>
<h4 id="to-many-relationships"><span>多对多关系</span></h4>
<p><span><span>与基本属性一样,您也可以使用对象列表来形成多对多关系。</span><span>这可以通过附加</span></span><code>[]</code><span>到目标对象模式的名称,或者通过将属性类型设置为</span><code>list</code><span>并指定</span><code>objectType</code><span>:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="c1">// The following property definitions are equivalent
<span class="na">cars<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'list'<span class="p">, <span class="na">objectType<span class="p">: <span class="s1">'Car'<span class="p">},
<span class="na">vans<span class="p">: <span class="s1">'Car[]'
<span class="p">}
<span class="p">}
<span class="kd">let <span class="nx">carList <span class="o">= <span class="nx">person<span class="p">.<span class="nx">cars<span class="p">;
<span class="c1">// Add new cars to the list
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="nx">carList<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Accord'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">100<span class="p">});
<span class="nx">carList<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Toyota'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Prius'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">200<span class="p">});
<span class="p">});
<span class="kd">let <span class="nx">secondCar <span class="o">= <span class="nx">carList<span class="p">[<span class="mi">1<span class="p">].<span class="nx">model<span class="p">;<span class="c1">// access using an array index</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>与其他列表和一对一关系不同,多对多关系</span><em>不能</em><span>是可选的。</span></p>
<h4 id="inverse-relationships"><span>反向关系</span></h4>
<p><span><span>链接是单向的。</span><span>因此,如果to-many属性</span></span><code>Person.dogs</code><span>链接到</span><code>Dog</code><span>实例并且</span><code>Dog.owner</code><span><span>链接到</span><span>一个属性</span></span><code>Person</code><span><span>,则这些链接彼此独立。</span><span>将a </span><span>的</span><span>属性</span><span>附加</span></span><code>Dog</code><span>到</span><code>Person</code><span>实例的</span><code>dogs</code><span>属性不会自动将dog的</span><code>owner</code><span><span>属性</span><span>设置</span><span>为this </span></span><code>Person</code><span><span>。</span><span>因为手动同步关系对是容易出错,复杂和重复的信息,所以Realm提供链接对象属性来表示这些反向关系。</span></span></p>
<p><span><span>通过链接对象属性,您可以从特定属性获取链接到给定对象的所有对象。</span><span>例如,一个</span></span><code>Dog</code><span>对象可以拥有一个名为的属性</span><code>owners</code><span><span>,</span><span>该属性</span><span>包含</span><span>在其</span><span>属性</span></span><code>Person</code><span>中具有此确切</span><code>Dog</code><span><span>对象的</span><span>所有</span><span>对象</span></span><code>dogs</code><span><span>。</span><span>这是通过创建</span></span><code>owners</code><span><span>类型</span><span>的</span><span>属性</span></span><code>linkingObjects</code><span>然后指定它与</span><code>Person</code><span><span>对象</span><span>的关系来完成的</span><span>。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">dogs<span class="p">: <span class="s1">'Dog[]'
<span class="p">}
<span class="p">}
<span class="kr">const <span class="nx">DogSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">:<span class="s1">'Dog'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="c1">// No shorthand syntax for linkingObjects properties
<span class="na">owners<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'linkingObjects'<span class="p">, <span class="na">objectType<span class="p">: <span class="s1">'Person'<span class="p">, <span class="na">property<span class="p">: <span class="s1">'dogs'<span class="p">}
<span class="p">}
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>甲</span><code>linkingObjects</code><span>属性可以指向到一个</span><code>List</code><span>属性(一对多的关系)或</span><code>Object</code><span>属性(对一的关系):</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">ShipSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Ship'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">captain<span class="p">: <span class="s1">'Captain'
<span class="p">}
<span class="p">}
<span class="kr">const <span class="nx">CaptainSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Captain'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">ships<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'linkingObjects'<span class="p">, <span class="na">objectType<span class="p">: <span class="s1">'Ship'<span class="p">, <span class="na">property<span class="p">: <span class="s1">'captain'<span class="p">}
<span class="p">}
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>访问</span><code>linkingObjects</code><span>属性时,将</span><code>Results</code><span><span>返回</span><span>一个</span><span>对象,因此</span><span>完全支持</span><span>进一步的</span></span>查询和排序<span>。</span><code>linkingObject</code><span><span>属性属于从中获取的对象,无法直接设置或操作。</span><span>它们在提交事务时自动更新。</span></span></p>
<p><em><span><span>访问</span></span><code>linkingObjects</code><span><span>没有模式:</span></span></em><span>如果你已经打开了一个域文件没有指定一个模式,例如在一个</span>领域的功能<span>回调,你可以得到一个</span><code>linkingObjects</code><span>通过调用属性</span><code>linkingObjects(objectType, property)</code><span>上的</span><code>Object</code><span>实例:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">captain <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objectForPrimaryKey<span class="p">(<span class="s1">'Captain'<span class="p">, <span class="mi">1<span class="p">);
<span class="kd">let <span class="nx">ships <span class="o">= <span class="nx">captain<span class="p">.<span class="nx">linkingObjects<span class="p">(<span class="s1">'Ship'<span class="p">, <span class="s1">'captain'<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>链接对象属性</span><em>不能</em><span>是可选的。</span></p>
<h3 id="default-property-values"><span>默认属性值</span></h3>
<p><span>可以通过</span><code>default</code><span><span>在属性定义中</span><span>设置</span><span>指示符</span><span>来指定默认属性值</span><span>。</span><span>要使用默认值,请在对象创建期间保留未指定的属性。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">CarSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">make<span class="p">:<span class="p">{<span class="na">type<span class="p">: <span class="s1">'string'<span class="p">},
<span class="na">model<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'string'<span class="p">},
<span class="na">drive<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'string'<span class="p">, <span class="na">default<span class="p">: <span class="s1">'fwd'<span class="p">},
<span class="na">miles<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'int'<span class="p">, <span class="na">default<span class="p">: <span class="mi">0<span class="p">}
<span class="p">}
<span class="p">};
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="c1">// Since `miles` is left out it defaults to `0`, and since
<span class="c1">// `drive` is specified, it overrides the default value
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Car'<span class="p">, <span class="p">{<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Accord'<span class="p">, <span class="na">drive<span class="p">: <span class="s1">'awd'<span class="p">});
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="indexed-properties"><span>索引属性</span></h3>
<p><span>您可以</span><code>indexed</code><span><span>向属性定义</span><span>添加</span><span>指示符以使该属性编入索引。</span><span>这是支持的</span></span><code>int</code><span>,</span><code>string</code><span>,</span><code>bool</code><span>,和</span><code>date</code><span>物业类型:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">var <span class="nx">BookSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Book'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="p">{ <span class="na">type<span class="p">: <span class="s1">'string'<span class="p">, <span class="na">indexed<span class="p">: <span class="kc">true <span class="p">},
<span class="na">price<span class="p">: <span class="s1">'float'
<span class="p">}
<span class="p">};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>索引属性将极大地加速查询,其中以较慢的插入为代价比较属性的相等性。</span></p>
<h3 id="primary-keys"><span>主键</span></h3>
<p><span>您可以</span><code>primaryKey</code><span>在对象模型</span><code>string</code><span>和</span><code>int</code><span><span>属性中</span><span>指定</span><span>属性。</span><span>声明主键可以有效地查找和更新对象,并为每个值强制实现唯一性。</span><span>将具有主键的对象添加到Realm后,无法更改主键。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">BookSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Book'<span class="p">,
<span class="na">primaryKey<span class="p">: <span class="s1">'id'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">id<span class="p">: <span class="s1">'int'<span class="p">, <span class="c1">// primary key
<span class="na">title<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">price<span class="p">: <span class="s1">'float'
<span class="p">}
<span class="p">};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>主键属性会自动编入索引。</span></p>
<h2><span>写</span></h2>
<p><span>对领域中对象的更改 - 创建,更新和删除 - 必须在</span><code>write()</code><span><span>事务块中进行。</span><span>请注意,写入事务具有不可忽略的开销; </span><span>您应该尽量减少</span></span><code>write</code><span><span>代码中</span><span>的</span><span>块</span><span>数</span><span>。</span></span></p>
<h3 id="creating-objects"><span>创建对象</span></h3>
<p><span>使用以下</span><code>create</code><span><span>方法</span><span>创建对象</span><span>:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="k">try <span class="p">{
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Car'<span class="p">, <span class="p">{<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Accord'<span class="p">, <span class="na">drive<span class="p">: <span class="s1">'awd'<span class="p">});
<span class="p">});
<span class="p">} <span class="k">catch <span class="p">(<span class="nx">e<span class="p">) <span class="p">{
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="s2">"Error on creation"<span class="p">);
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>请注意,抛出的任何异常都</span><code>write()</code><span><span>将取消该事务。</span><span>该</span></span><code>try/catch</code><span>块不会在所有示例中显示,但这是一种很好的做法。</span></p>
<h3 id="nested-objects"><span>嵌套对象</span></h3>
<p><span>如果对象具有对象属性,则可以通过为每个子属性指定JSON值来递归地创建这些属性的值:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Joe'<span class="p">,
<span class="c1">// nested objects are created recursively
<span class="na">car<span class="p">: <span class="p">{<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Accord'<span class="p">, <span class="na">drive<span class="p">: <span class="s1">'awd'<span class="p">},
<span class="p">});
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="updating-objects"><span>更新对象</span></h3>
<h4 id="typed-updates"><span>键入的更新</span></h4>
<p><span>您可以通过在写入事务中设置其属性来更新任何对象。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="nx">car<span class="p">.<span class="nx">miles <span class="o">= <span class="mi">1100<span class="p">;
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4 id="creating-and-updating-objects-with-primary-keys"><span>使用主键创建和更新对象</span></h4>
<p><span>如果模型类包含</span>主键<span><span>,则可以让Realm根据其主键值智能地更新或添加对象。</span><span>这是通过将</span></span><code>true</code><span><span>第三个参数</span><span>传递</span><span>给</span></span><code>create</code><span><span>方法</span><span>来完成的</span><span>:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="c1">// Create a book object
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Book'<span class="p">, <span class="p">{<span class="na">id<span class="p">: <span class="mi">1<span class="p">, <span class="na">title<span class="p">: <span class="s1">'Recipes'<span class="p">, <span class="na">price<span class="p">: <span class="mi">35<span class="p">});
<span class="c1">// Update book with new price keyed off the id
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Book'<span class="p">, <span class="p">{<span class="na">id<span class="p">: <span class="mi">1<span class="p">, <span class="na">price<span class="p">: <span class="mi">55<span class="p">}, <span class="kc">true<span class="p">);
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>在上面的示例中,由于对象已经存在</span><code>id</code><span>,</span><code>1</code><span>并且我们已经</span><code>true</code><span><span>为第三个参数</span><span>传入</span><span>了</span><span>值,</span><span>因此更新price属性而不是尝试创建新对象。</span><span>由于</span></span><code>title</code><span><span>省略了</span><span>该</span><span>属性,因此该对象保留此属性的原始值。</span><span>请注意,在创建或更新具有主键属性的对象时,必须指定主键。</span></span></p>
<h3 id="deleting-objects"><span>删除对象</span></h3>
<p><span>可以通过</span><code>delete</code><span><span>在写入事务中</span><span>调用</span><span>方法</span><span>来删除对象</span><span>。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="c1">// Create a book object
<span class="kd">let <span class="nx">book <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Book'<span class="p">, <span class="p">{<span class="na">id<span class="p">: <span class="mi">1<span class="p">, <span class="na">title<span class="p">: <span class="s1">'Recipes'<span class="p">, <span class="na">price<span class="p">: <span class="mi">35<span class="p">});
<span class="c1">// Delete the book
<span class="nx">realm<span class="p">.<span class="k">delete<span class="p">(<span class="nx">book<span class="p">);
<span class="c1">// Delete multiple books by passing in a `Results`, `List`,
<span class="c1">// or JavaScript `Array`
<span class="kd">let <span class="nx">allBooks <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Book'<span class="p">);
<span class="nx">realm<span class="p">.<span class="k">delete<span class="p">(<span class="nx">allBooks<span class="p">); <span class="c1">// Deletes all books
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2><span>查询</span></h2>
<p><span><span>查询允许您从Realm获取单个类型的对象,并可选择过滤和排序这些结果。</span><span>所有查询(包括查询和属性访问)在Realm中都是惰性的。</span><span>只有在访问对象和属性时才会读取数据。</span><span>这允许您以高效的方式表示大量数据。</span></span></p>
<p><span>执行查询时,会返回一个</span><code>Results</code><span><span>对象。</span><span>结果只是您的数据视图,并且不可变。</span></span></p>
<p><span>从Realm中检索对象的最基本方法是使用a上的</span><code>objects</code><span>方法</span><code>Realm</code><span>获取给定类型的所有对象:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">dogs <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Dog'<span class="p">); <span class="c1">// retrieves all Dogs from the Realm</span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="filtering"><span>过滤</span></h3>
<p><span>您可以</span><code>Results</code><span>通过</span><code>filtered</code><span>在a </span><code>List</code><span>或a </span><code>Results</code><span><span>上使用查询字符串</span><span>调用</span><span>方法来进行</span><span>过滤</span><span>。</span></span></p>
<p><span>例如,以下内容将更改我们之前的示例,以检索所有颜色为棕褐色且名称以“B”开头的狗:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">dogs <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Dog'<span class="p">);
<span class="kd">let <span class="nx">tanDogs <span class="o">= <span class="nx">dogs<span class="p">.<span class="nx">filtered<span class="p">(<span class="s1">'color = "tan" AND name BEGINSWITH "B"'<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>Realm支持的查询语言受到</span>Apple的NSPredicate的<span><span>启发</span><span>。</span><span>让我们简要总结一下支持的功能和语法:</span></span></p>
<ul>
<li><span><span>比较操作数可以是属性名称或常量。</span><span>至少有一个操作数必须是属性名称。</span><span>特殊常量</span></span><code>false</code><span>,</span><code>true</code><span>和</span><code>null</code><span>。</span></li>
<li><span>时间戳可以以格式指定,</span><code>YYYY-MM-DD@HH:MM:SS:NANOSECONDS</code><span>并且</span><code>YYYY-MM-DDTHH:MM:SS:NANOSECONDS</code><span>可以省略纳秒。</span></li>
<li><span>比较运算符</span><code>=</code><span>/ </span><code>==</code><span>,</span><code><=</code><span>,</span><code><</code><span>,</span><code>>=</code><span>,</span><code>></code><span>,和</span><code>!=</code><span>/ </span><code><></code><span>都支持</span><code>int</code><span>,</span><code>float</code><span>,</span><code>double</code><span>,和</span><code>Date</code><span>物业类型,例如</span><code>age = 45</code><span>。</span></li>
<li><span><span>boolean(</span><span>)属性</span><span>支持</span><span>比较运算符</span></span><code>=</code><span>/ </span><code>==</code><span>和</span><code>!=</code><span><span>/ </span><span>。</span></span><code><></code><code>bool</code></li>
<li><span>对于串和数据(</span><code>ArrayBuffer</code><span>)的属性,所述</span><code>=</code><span>(和</span><code>==</code><span>), </span><code>!=</code><span><span>(</span><span>和</span></span><code><></code><span>), ,</span><code>BEGINSWITH</code><span>,</span><code>CONTAINS</code><span>和</span><code>ENDSWITH</code><span>运营商都支持,例如</span><code>name CONTAINS 'Ja'</code><span>。</span></li>
<li><span>对于带有</span><code>LIKE</code><span><span>运算符的</span><span>字符串,可以进行通配符比较</span><span>,例如</span></span><code>name LIKE '*an?'</code><span>匹配“Jane”,“Dan”,“Shane”等。</span></li>
<li><span>使用</span><code></code><span><span>例如</span><span>字符串的字符串不区分大小写的比较</span></span><code>CONTAINS 'Ja'</code><span><span>。</span><span>请注意,只有字符“AZ”和“az”才会被忽略。</span></span></li>
<li><span>Realm支持以下复合运算符:</span><code>AND</code><span>/ </span><code>&&</code><span>,</span><code>OR</code><span>/ </span><code>||</code><span>和</span><code>NOT</code><span>/ </span><code>!</code><span>,例如</span><code>name BEGINSWITH 'J' AND age >= 32</code><span>。</span></li>
<li><span>该集合表达式</span><code>@count</code><span>/ </span><code>@size</code><span>,</span><code>@min</code><span>,</span><code>@max</code><span>,</span><code>@sum</code><span>并且</span><code>@avg</code><span>都支持列表属性,如</span><code>employees.@count > 5</code><span>发现有更多的5个元素员工的清单。</span></li>
<li><span><span>字符串和二进制属性</span><span>的聚合表达式</span></span><code>@count</code><span>/ </span><code>@size</code><span>,例如</span><code>name.@size = 5</code><span><span>,查找名称为5个字母的所有</span><span>字符串</span><span>。</span></span></li>
<li><span>关键路径可以遵循列表属性关系,例如</span><code>child.age >= 13</code><span>和</span><code>cars.@avg.milage > 1000</code><span>。</span></li>
<li><span>关键路径也可以跟随链接对象(反向链接),例如</span><code>parents.age > 25</code><span>和</span><code>parents.@count == 2</code><span>。</span></li>
<li><span>的</span><code>$</code><span>操作者可用于替代参数,例如</span><code>child.age >= $0</code><span>(见下面的示例)。</span></li>
<li><span>排序和查找不同的值是可能的功能</span><code>SORT</code><span>和</span><code>DISTINCT</code><span>如</span><code>age > 20 SORT(name ASC, age DESC) DISTINCT(name)</code><span>。</span>
<ul>
<li><span>用于排序的排序可以是以下不区分大小写的文字中的一个:</span><code>ASC</code><span>,</span><code>ASCENDING</code><span>,</span><code>DESC</code><span>,</span><code>DESCENDING</code><span>。</span></li>
<li><span>括号内的逗号分隔列表中可以显示任意数量的属性。</span></li>
<li><span>可以指示任意数量的排序/不同条件,它们将按指定的顺序应用。</span></li>
<li><span>Sort或distinct不能独立运行,这些条件必须附加到至少一个查询过滤器。</span></li>
</ul>
</li>
</ul>
<p><span>关于如何查询Realm的一个非常重要的例子是:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">Realm <span class="o">= <span class="nx">require<span class="p">(<span class="s1">'realm'<span class="p">);
<span class="kr">const <span class="nx">CarSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Car'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">make<span class="p">:<span class="s1">'string'<span class="p">,
<span class="na">model<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">miles<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'int'<span class="p">, <span class="na">default<span class="p">: <span class="mi">0<span class="p">},
<span class="p">}
<span class="p">};
<span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">cars<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'list'<span class="p">, <span class="na">objectType<span class="p">: <span class="s1">'Car'<span class="p">},
<span class="p">}
<span class="p">};
<span class="c1">// Initialize a Realm with Car and Person models
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarSchema<span class="p">, <span class="nx">PersonSchema<span class="p">]})
<span class="p">.<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="c1">// Add persons and their cars
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="kd">let <span class="nx">john <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{<span class="na">name<span class="p">: <span class="s1">'John'<span class="p">, <span class="na">cars<span class="p">: <span class="p">[]});
<span class="nx">john<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">,<span class="na">model<span class="p">: <span class="s1">'Accord'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">1500<span class="p">});
<span class="nx">john<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Toyota'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Prius'<span class="p">,<span class="na">miles<span class="p">: <span class="mi">2780<span class="p">});
<span class="kd">let <span class="nx">joan <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{<span class="na">name<span class="p">: <span class="s1">'Joan'<span class="p">, <span class="na">cars<span class="p">: <span class="p">[]});
<span class="nx">joan<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Skoda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Octavia'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">1120<span class="p">});
<span class="nx">joan<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Ford'<span class="p">,<span class="na">model<span class="p">: <span class="s1">'Fiesta'<span class="p">,<span class="na">miles<span class="p">: <span class="mi">95<span class="p">});
<span class="nx">joan<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'VW'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'Golf'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">1270<span class="p">});
<span class="kd">let <span class="nx">jill <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{<span class="na">name<span class="p">: <span class="s1">'Jill'<span class="p">, <span class="na">cars<span class="p">: <span class="p">[]});
<span class="kd">let <span class="nx">jack <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Person'<span class="p">, <span class="p">{<span class="na">name<span class="p">: <span class="s1">'Jack'<span class="p">, <span class="na">cars<span class="p">: <span class="p">[]});
<span class="nx">jack<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">push<span class="p">({<span class="na">make<span class="p">: <span class="s1">'Porche'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'911'<span class="p">, <span class="na">miles<span class="p">: <span class="mi">965<span class="p">});
<span class="p">});
<span class="c1">// Find car owners
<span class="kd">let <span class="nx">carOwners <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'cars.@size > 0'<span class="p">);
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="s1">'Car owners'<span class="p">)
<span class="k">for <span class="p">(<span class="kd">let <span class="nx">p <span class="nx">of <span class="nx">carOwners<span class="p">) <span class="p">{
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="err">`<span class="nx">$<span class="p">{<span class="nx">p<span class="p">.<span class="nx">name<span class="p">}<span class="err">`<span class="p">);
<span class="p">}
<span class="c1">// Find who has been driver longer than average
<span class="kd">let <span class="nx">average <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">).<span class="nx">avg<span class="p">(<span class="s1">'miles'<span class="p">);
<span class="kd">let <span class="nx">longerThanAverage <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'cars.@sum.miles > $0'<span class="p">, <span class="nx">average<span class="p">);
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="err">`<span class="nx">Longer <span class="nx">than <span class="nx">average <span class="p">(<span class="nx">$<span class="p">{<span class="nx">average<span class="p">})<span class="err">`<span class="p">)
<span class="k">for <span class="p">(<span class="kd">let <span class="nx">p <span class="nx">of <span class="nx">longerThanAverage<span class="p">) <span class="p">{
<span class="nx">console<span class="p">.<span class="nx">log<span class="p">(<span class="err">`<span class="nx">$<span class="p">{<span class="nx">p<span class="p">.<span class="nx">name<span class="p">}: <span class="nx">$<span class="p">{<span class="nx">p<span class="p">.<span class="nx">cars<span class="p">.<span class="nx">sum<span class="p">(<span class="s1">'miles'<span class="p">)}<span class="err">`<span class="p">);
<span class="p">}
<span class="nx">realm<span class="p">.<span class="nx">close<span class="p">();
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>代码段的输出是:</span></p>
<pre class="highlight plaintext"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>Car owners
John
Joan
Jack
Longer than average (1288.3333333333333)
John: 4280
Joan: 2485</code></pre>
<h3 id="sorting"><span>排序</span></h3>
<p><code>Results</code><span><span>允许您根据单个或多个属性指定排序条件和顺序。</span><span>例如,以下调用按上述数字按里程对上述示例中返回的汽车进行排序:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">hondas <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'make = "Honda"'<span class="p">);
<span class="c1">// Sort Hondas by mileage
<span class="kd">let <span class="nx">sortedHondas <span class="o">= <span class="nx">hondas<span class="p">.<span class="nx">sorted<span class="p">(<span class="s1">'miles'<span class="p">);
<span class="c1">// Sort in descending order instead
<span class="nx">sortedHondas <span class="o">= <span class="nx">hondas<span class="p">.<span class="nx">sorted<span class="p">(<span class="s1">'miles'<span class="p">, <span class="kc">true<span class="p">);
<span class="c1">// Sort by price in descending order and then miles in ascending
<span class="nx">sortedHondas <span class="o">= <span class="nx">hondas<span class="p">.<span class="nx">sorted<span class="p">([[<span class="s1">'price'<span class="p">, <span class="kc">true<span class="p">], <span class="p">[<span class="s1">'miles'<span class="p">, <span class="kc">false<span class="p">]]);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><code>Results</code><span> 也可以对您正在排序的对象链接的对象的值进行排序:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">people <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">);
<span class="c1">// Sort people by the milage of their cars
<span class="kd">let <span class="nx">sortedPeople <span class="o">= <span class="nx">people<span class="p">.<span class="nx">sorted<span class="p">(<span class="s1">'car.miles'<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><code>List</code><span>基本类型的s可以通过调用它们的值进行排序,</span><code>sorted()</code><span>而无需指定属性:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">person <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">)[<span class="mi">0<span class="p">];
<span class="kd">let <span class="nx">sortedTestScores <span class="o">= <span class="nx">person<span class="p">.<span class="nx">testScores<span class="p">.<span class="nx">sorted<span class="p">();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<div class="alert alert-warning">
<p><span>请注意,</span><code>Results</code><span><span>仅在查询排序时保证</span><span>顺序</span><span>保持一致。</span><span>出于性能原因,不保证保留插入顺序。</span></span></p>
</div>
<h3 id="auto-updating-results"><span>自动更新结果</span></h3>
<p><code>Results</code><span><span>实例是实时的,自动更新基础数据的视图,这意味着永远不必重新获取结果。</span><span>修改影响查询的对象将立即反映在结果中。</span><span>对此的一个例外是当使用</span></span><code>for...in</code><span>或时</span><code>for...of</code><span>,它将始终迭代在迭代开始时与查询匹配的对象,即使它们中的一些被删除或修改以在迭代期间被过滤器排除。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">hondas <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'make = "Honda"'<span class="p">);
<span class="c1">// hondas.length == 0
<span class="nx">realm<span class="p">.<span class="nx">write<span class="p">(() <span class="o">=> <span class="p">{
<span class="nx">realm<span class="p">.<span class="nx">create<span class="p">(<span class="s1">'Car'<span class="p">, <span class="p">{<span class="na">make<span class="p">: <span class="s1">'Honda'<span class="p">, <span class="na">model<span class="p">: <span class="s1">'RSX'<span class="p">});
<span class="p">});
<span class="c1">// hondas.length == 1</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>这适用于所有</span><code>Results</code><span>情况,包括那些被返回</span><code>objects</code><span>,</span><code>filtered</code><span>和</span><code>sorted</code><span>方法。</span></p>
<p><span>这种属性</span><code>Results</code><span><span>不仅使Realm快速高效,而且使您的代码更简单,更具反应性。</span><span>例如,如果您的视图依赖于查询的结果,则可以将其存储</span></span><code>Results</code><span>在属性中并对其进行访问,而无需确保在每次访问之前刷新其数据。</span></p>
<p><span>您可以订阅</span>通知<span>以了解Realm数据何时更新,指示应该刷新应用程序的UI的时间,而无需重新获取</span><code>Results</code><span>。</span></p>
<h3 id="limiting-results"><span>限制结果</span></h3>
<p><span><span>大多数其他数据库技术提供了从查询中“分页”结果的能力(例如SQLite中的'LIMIT'关键字)。</span><span>这通常是为了避免从磁盘中读取太多内容,或者一次将太多结果拉入内存中。</span></span></p>
<p><span>由于Realm中的查询是惰性的,因此根本不需要执行这种分页行为,因为Realm只会在显式访问后从查询结果中加载对象。</span></p>
<p><span>如果出于UI相关或其他实现原因,您需要查询中特定的对象子集,那么就像获取</span><code>Results</code><span><span>对象</span><span>一样简单</span><span>,只读取您需要的对象。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">let <span class="nx">cars <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">);
<span class="c1">// get first 5 Car objects
<span class="kd">let <span class="nx">firstCars <span class="o">= <span class="nx">cars<span class="p">.<span class="nx">slice<span class="p">(<span class="mi">0<span class="p">, <span class="mi">5<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2><span>迁移</span></h2>
<p><span><span>使用数据库时,您的数据模型很可能会随时间而变化。</span><span>例如,假设我们有以下</span></span><code>Person</code><span>模型:</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">firstName<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">lastName<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">age<span class="p">: <span class="s1">'int'
<span class="p">}
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>我们希望更新数据模型以要求</span><code>name</code><span><span>属性,而不是分隔名和姓。</span><span>为此,我们只需将架构更改为以下内容:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">PersonSchema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'string'<span class="p">,
<span class="na">age<span class="p">: <span class="s1">'int'
<span class="p">}
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span><span>此时,如果您使用以前的型号版本保存了任何数据,则新代码与Realm存储在磁盘上的旧数据之间将不匹配。</span><span>发生这种情况时,除非运行迁移,否则在尝试使用新架构打开现有Realm时将引发异常。</span></span></p>
<h3 id="performing-a-migration"><span>执行迁移</span></h3>
<p><span>您可以通过更新</span>schemaVersion<span>并定义可选</span><code>migration</code><span><span>功能来</span><span>定义迁移和关联的模式版本</span><span>。</span><span>您的迁移功能提供将数据模型从先前模式转换为新模式所需的任何逻辑。</span><span>打开</span></span><code>Realm</code><span>时,</span><code>Realm</code><span><span>仅当需要</span><span>迁移时,才会应用迁移功能来更新</span><span>给定的模式版本。</span></span></p>
<p><span>如果未提供迁移功能,则会自动添加任何新属性,并在更新到新属性时从数据库中删除旧属性</span><code>schemaVersion</code><span><span>。</span><span>如果在升级版本时需要更新旧属性或填充新属性,可以在迁移功能中执行此操作。</span><span>例如,假设我们想要迁移</span></span><code>Person</code><span><span>先前声明</span><span>的</span><span>模型。</span><span>您可以</span></span><code>name</code><span>使用旧的</span><code>firstName</code><span>和</span><code>lastName</code><span><span>属性</span><span>填充</span><span>新架构的</span><span>属性:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({
<span class="na">schema<span class="p">: <span class="p">[<span class="nx">PersonSchema<span class="p">],
<span class="na">schemaVersion<span class="p">: <span class="mi">1<span class="p">,
<span class="na">migration<span class="p">: <span class="p">(<span class="nx">oldRealm<span class="p">, <span class="nx">newRealm<span class="p">) <span class="o">=> <span class="p">{
<span class="c1">// only apply this change if upgrading to schemaVersion 1
<span class="k">if <span class="p">(<span class="nx">oldRealm<span class="p">.<span class="nx">schemaVersion <span class="o">< <span class="mi">1<span class="p">) <span class="p">{
<span class="kr">const <span class="nx">oldObjects <span class="o">= <span class="nx">oldRealm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">);
<span class="kr">const <span class="nx">newObjects <span class="o">= <span class="nx">newRealm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">);
<span class="c1">// loop through all objects and set the name property in the new schema
<span class="k">for <span class="p">(<span class="kd">let <span class="nx">i <span class="o">= <span class="mi">0<span class="p">; <span class="nx">i <span class="o">< <span class="nx">oldObjects<span class="p">.<span class="nx">length<span class="p">; <span class="nx">i<span class="o">++<span class="p">) <span class="p">{
<span class="nx">newObjects<span class="p">[<span class="nx">i<span class="p">].<span class="nx">name <span class="o">= <span class="nx">oldObjects<span class="p">[<span class="nx">i<span class="p">].<span class="nx">firstName <span class="o">+ <span class="s1">' ' <span class="o">+ <span class="nx">oldObjects<span class="p">[<span class="nx">i<span class="p">].<span class="nx">lastName<span class="p">;
<span class="p">}
<span class="p">}
<span class="p">}
<span class="p">}).<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="kr">const <span class="nx">fullName <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Person'<span class="p">)[<span class="mi">0<span class="p">].<span class="nx">name<span class="p">;
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>成功完成迁移后,您的应用程序可以像往常一样访问Realm及其所有对象。</span></p>
<h3 id="linear-migrations"><span>线性迁移</span></h3>
<p><span><span>使用上述迁移模式,迁移多个版本时可能会遇到问题。</span><span>如果用户跳过应用更新并且在跳过的版本中多次更改属性,则可能会发生这种情况。</span><span>在这种情况下,您可能需要编辑旧的迁移代码,以便将数据从旧架构正确更新到最新架构。</span></span></p>
<p><span><span>通过顺序运行多个迁移可以避免此问题,确保将数据库升级到每个先前版本并运行关联的迁移代码。</span><span>遵循此模式时,永远不必修改旧的迁移代码,尽管您需要保留所有旧的模式和迁移块以供将来使用。</span><span>这看起来像一个例子:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">const <span class="nx">schemas <span class="o">= <span class="p">[
<span class="p">{ <span class="na">schema<span class="p">: <span class="nx">schema1<span class="p">, <span class="na">schemaVersion<span class="p">: <span class="mi">1<span class="p">, <span class="na">migration<span class="p">: <span class="nx">migrationFunction1 <span class="p">},
<span class="p">{ <span class="na">schema<span class="p">: <span class="nx">schema2<span class="p">, <span class="na">schemaVersion<span class="p">: <span class="mi">2<span class="p">, <span class="na">migration<span class="p">: <span class="nx">migrationFunction2 <span class="p">},
<span class="p">...
<span class="p">]
<span class="c1">// the first schema to update to is the current schema version
<span class="c1">// since the first schema in our array is at
<span class="kd">let <span class="nx">nextSchemaIndex <span class="o">= <span class="nx">Realm<span class="p">.<span class="nx">schemaVersion<span class="p">(<span class="nx">Realm<span class="p">.<span class="nx">defaultPath<span class="p">);
<span class="k">while <span class="p">(<span class="nx">nextSchemaIndex <span class="o">< <span class="nx">schemas<span class="p">.<span class="nx">length<span class="p">) <span class="p">{
<span class="kr">const <span class="nx">migratedRealm <span class="o">= <span class="k">new <span class="nx">Realm<span class="p">(<span class="nx">schemas<span class="p">[<span class="nx">nextSchemaIndex<span class="o">++<span class="p">]);
<span class="nx">migratedRealm<span class="p">.<span class="nx">close<span class="p">();
<span class="p">}
<span class="c1">// open the Realm with the latest schema
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">(<span class="nx">schemas<span class="p">[<span class="nx">schemas<span class="p">.<span class="nx">length<span class="o">-<span class="mi">1<span class="p">]);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2><span>通知</span></h2>
<p><span>和</span><code>Realm</code><span>,</span><code>Results</code><span>和</span><code>List</code><span>对象提供</span><code>addListener</code><span><span>了注册通知回调的方法。</span><span>每当更新对象时,都将调用更改通知回调。</span></span></p>
<p><span>有两种通知,“领域通知”(提交写入事务时通知的简单回调)和“收集通知”(在插入,删除和更新时接收更改元数据的更复杂的回调)。</span></p>
<p><span>在某些情况下,可以在事务</span><em>开始</em><span><span>时调用侦听器</span><span>- 如果Realm进入最新版本,或者以触发通知的方式修改或删除正在观察的Realm实体。</span><span>在这些情况下,侦听器在当前写入事务的上下文中运行,因此尝试在通知处理程序中开始新的写入事务将引发异常。</span><span>您可以使用该</span></span><code>Realm.isInTransaction</code><span>属性来确定您的代码是否在写入事务中执行。</span></p>
<h3 id="realm-notifications"><span>领域通知</span></h3>
<p><span><span>每次提交写入事务时,Realm实例都会向其他实例发送通知。</span><span>要注册通知:</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">function <span class="nx">updateUI<span class="p">() <span class="p">{
<span class="c1">// ...
<span class="p">}
<span class="c1">// Observe Realm Notifications
<span class="nx">realm<span class="p">.<span class="nx">addListener<span class="p">(<span class="s1">'change'<span class="p">, <span class="nx">updateUI<span class="p">);
<span class="c1">// ..later remove the listener
<span class="nx">realm<span class="p">.<span class="nx">removeListener<span class="p">(<span class="s1">'change'<span class="p">, <span class="nx">updateUI<span class="p">);
<span class="c1">// ..or unregister all listeners
<span class="nx">realm<span class="p">.<span class="nx">removeAllListeners<span class="p">();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="collection-notifications"><span>收集通知</span></h3>
<p><span><span>收集通知包含描述在细粒度级别上发生了哪些更改的信息。</span><span>这包括自上次通知以来已插入,删除或修改的对象的索引。</span><span>集合通知是异步传递的:首先是初始结果,然后是在修改集合中任何对象的任何写入事务之后,从集合中删除对象,或者将新对象添加到集合中。</span></span></p>
<p><span>给出的通知回调函数</span><code>addListener</code><span><span>在发生这些更改时接收两个参数。</span><span>第一个是更改的集合,第二个是</span></span><code>changes</code><span><span>具有关于受删除,插入和修改影响的集合索引的信息</span><span>的</span><span>对象。</span></span></p>
<p><span>前两个,</span>删除<span>和</span>插入<span><span>,只要对象开始和停止成为集合的一部分,就会记录索引。</span><span>这会将对象添加到Realm或从Realm中删除它们时考虑在内。</span><span>为此,</span></span><code>Results</code><span><span>当您筛选特定值并更改对象以使其现在与查询匹配或不再匹配时也适用。</span><span>对于基于的集合</span></span><code>List</code><span>,这适用于在关系中添加或删除对象时。</span></p>
<p><span><span>每当对象的属性发生更改时,</span><span>您的应用程序都会收到有关</span></span>修改的<span><span>通知</span><span>,这些属性以前是该集合的一部分,并且仍然是其中的一部分。</span><span>当to-one和to-many关系发生变化时,也会发生这种情况,但不会考虑反向关系的变化。</span></span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kr">class <span class="nx">Dog <span class="p">{}
<span class="nx">Dog<span class="p">.<span class="nx">schema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Dog'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">:<span class="s1">'string'<span class="p">,
<span class="na">age<span class="p">: <span class="s1">'int'<span class="p">,
<span class="p">}
<span class="p">};
<span class="kr">class <span class="nx">Person <span class="p">{}
<span class="nx">Person<span class="p">.<span class="nx">schema <span class="o">= <span class="p">{
<span class="na">name<span class="p">: <span class="s1">'Person'<span class="p">,
<span class="na">properties<span class="p">: <span class="p">{
<span class="na">name<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'string'<span class="p">},
<span class="na">dogs<span class="p">: <span class="p">{<span class="na">type<span class="p">: <span class="s1">'list'<span class="p">, <span class="na">objectType<span class="p">: <span class="s1">'Dog'<span class="p">},
<span class="p">}
<span class="p">};</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span><span>我们假设您正在观察上面的模型代码给出的狗主人名单。</span><span>在下列情况下,您将收到有关匹配</span></span><code>Person</code><span><span>对象的</span><span>修改的通知</span><span>:</span></span></p>
<ul>
<li><span>你修改</span><code>Person</code><span>的</span><code>name</code><span>属性。</span></li>
<li><span>您添加或删除</span><code>Dog</code><span>到</span><code>Person</code><span>的</span><code>dogs</code><span>财产。</span></li>
<li><span><span>您修改</span><span>属于</span><span>该</span></span><code>age</code><span><span>属性的属性</span><span>。</span></span><code>Dog</code><code>Person</code></li>
</ul>
<p><span>这使得可以离散地控制对UI内容进行的动画和视觉更新,而不是每次发生通知时任意重新加载所有内容。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="nx">collectionListenerRetainer <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Dog'<span class="p">).<span class="nx">filtered<span class="p">(<span class="s1">'age < 2'<span class="p">);
<span class="c1">// Observe Collection Notifications
<span class="kd">function <span class="nx">listener<span class="p">(<span class="nx">puppies<span class="p">, <span class="nx">changes<span class="p">) <span class="p">{
<span class="c1">// Update UI in response to inserted objects
<span class="nx">changes<span class="p">.<span class="nx">insertions<span class="p">.<span class="nx">forEach<span class="p">((<span class="nx">index<span class="p">) <span class="o">=> <span class="p">{
<span class="kd">let <span class="nx">insertedDog <span class="o">= <span class="nx">puppies<span class="p">[<span class="nx">index<span class="p">];
<span class="p">...
<span class="p">});
<span class="c1">// Update UI in response to modified objects
<span class="nx">changes<span class="p">.<span class="nx">modifications<span class="p">.<span class="nx">forEach<span class="p">((<span class="nx">index<span class="p">) <span class="o">=> <span class="p">{
<span class="kd">let <span class="nx">modifiedDog <span class="o">= <span class="nx">puppies<span class="p">[<span class="nx">index<span class="p">];
<span class="p">...
<span class="p">});
<span class="c1">// Update UI in response to deleted objects
<span class="nx">changes<span class="p">.<span class="nx">deletions<span class="p">.<span class="nx">forEach<span class="p">((<span class="nx">index<span class="p">) <span class="o">=> <span class="p">{
<span class="c1">// Deleted objects cannot be accessed directly
<span class="c1">// Support for accessing deleted objects coming soon...
<span class="p">...
<span class="p">});
<span class="p">});
<span class="nx">collectionListenerRetainer<span class="p">.<span class="nx">addListener<span class="p">(<span class="nx">listener<span class="p">);
<span class="c1">// Unregister all listeners
<span class="nx">realm<span class="p">.<span class="nx">removeAllListeners<span class="p">();
<span class="c1">// OR Unregister this listener
<span class="nx">collectionListenerRetainer<span class="p">.<span class="nx">removeListener<span class="p">(<span class="nx">listener<span class="p">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2><span>使用同步领域</span></h2>
<div class="alert alert-info">
<p><span>您是否希望使用Realm Mobile Platform同步所有Realm数据库?</span><span>所有与同步相关的文档已移至我们的平台文档中</span></p>
</div>
<h2><span>加密</span></h2>
<div class="alert alert-info">
<p><span>请注意我们许可证的出口合规部分,因为如果您位于有美国出口限制或禁运的国家/地区,它会对使用Realm进行限制。</span></p>
</div>
<p><span>Realm支持在创建Realm时通过提供64字节加密密钥,使用AES-256 + SHA2加密磁盘上的数据库文件。</span></p>
<pre class="highlight javascript"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">var <span class="nx">key <span class="o">= <span class="k">new <span class="nx">Int8Array<span class="p">(<span class="mi">64<span class="p">);<span class="c1">// pupulate with a secure key
<span class="nx">Realm<span class="p">.<span class="nx">open<span class="p">({<span class="na">schema<span class="p">: <span class="p">[<span class="nx">CarObject<span class="p">], <span class="na">encryptionKey<span class="p">: <span class="nx">key<span class="p">})
<span class="p">.<span class="nx">then<span class="p">(<span class="nx">realm <span class="o">=> <span class="p">{
<span class="c1">// Use the Realm as normal
<span class="kd">var <span class="nx">dogs <span class="o">= <span class="nx">realm<span class="p">.<span class="nx">objects<span class="p">(<span class="s1">'Car'<span class="p">);
<span class="p">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span><span>这使得存储在磁盘上的所有数据都可以根据需要使用AES-256进行透明加密和解密,并使用SHA-2 HMAC进行验证。</span><span>每次获得Realm实例时都必须提供相同的加密密钥。</span></span></p>
<p><span>使用加密领域时,性能受到很小影响(通常低于10%)。</span></p>
<h2><span>例子</span></h2>
<p><span>可以在</span>realm-js存储库<span><span>中的GitHub上找到示例</span><span>。</span></span></p>
<p><span>请注意,在Android上,您需要安装NDK并且必须设置</span><code>ANDROID_NDK</code><span>环境变量。</span></p>
<pre class="highlight plaintext"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>export ANDROID_NDK=/usr/local/Cellar/android-ndk/r10e</code></pre>
<h2><span>故障排除</span></h2>
<h3 id="missing-realm-constructor"><span>缺少领域构造函数</span></h3>
<p><span>如果您的应用程序崩溃,告诉您未找到Realm构造函数,您可以尝试以下几种方法:</span></p>
<p><span>首先,跑 </span><code>react-native link realm</code></p>
<p><span>如果这没有帮助,并且您的问题出在Android上,请尝试:</span></p>
<p><span>在您的</span><code>MainApplication.java</code><span><span>文件中</span><span>添加以下内容</span><span>:</span></span></p>
<pre class="highlight java"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kn">import <span class="nn">io.realm.react.RealmReactPackage<span class="o">;</span></span></span></code></pre>
<p><span>并添加</span><code>RealmReactPackage</code><span>到包列表:</span></p>
<pre class="highlight java"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code><span class="kd">protected <span class="n">List <span class="nf">getPackages<span class="o">() <span class="o">{
<span class="k">return <span class="n">Arrays<span class="o">.<span class="na">asList<span class="o">(
<span class="k">new <span class="nf">MainReactPackage<span class="o">(),
<span class="k">new <span class="nf">RealmReactPackage<span class="o">() <span class="c1">// add this line
<span class="o">);
<span class="o">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><span>在以下两行中添加</span><code>settings.gradle</code><span>:</span></p>
<pre class="highlight plaintext"><button class="btn" data-clipboard-snippet=""><img src="https://realm.io/assets/svg/docs/clippy.svg" alt="复制到剪贴板" width="13" class="clippy"></button><code>include ':realm'
project(':realm').projectDir = new File(settingsDir, '../node_modules/realm/android')</code></pre>
<p><span>如果您的问题出现在iOS上,请尝试:</span></p>
<ol>
<li><span>关闭所有模拟器/设备构建</span></li>
<li><span>停止在终端中运行的包管理器(或者更好的是,只需重新启动终端)</span></li>
<li><span>在Finder中打开app根目录中的ios文件夹</span></li>
<li><span>进入build文件夹(注意:你不会在atom中看到这个build文件夹,所以只需右键单击ios并在finder中单击open)</span></li>
<li><span>删除构建文件夹内的所有内容(只需移动到垃圾箱并保留垃圾,以防您担心)</span></li>
<li><span>运行</span><code>react-native run-ios</code><span>以重建整个事物</span></li>
</ol>
<h3 id="chrome-debugging-is-slow"><span>Chrome调试很慢</span></h3>
<p><span><span>我们意识到这一点。</span><span>这样做的原因是,由于Realm是用C ++编写的并且运行本机代码,因此它必须在设备/模拟器上运行。</span><span>但是考虑到零复制体系结构,每次检查存储在Realm中的对象时,我们都需要通过RPC线在realm对象中发送值。</span></span></p>
<p><span><span>我们正在研究解决此问题的各种潜在解决方案。</span><span>如果您想跟踪它,可以按照</span></span>GitHub问题进行操作<span>。</span></p>
<h3 id="cannot-download-realm-sync-cocoa"><span>无法下载 </span><code>realm-sync-cocoa</code></h3>
<p><span><span>我们已经看到一些报告,由于下载问题,用户无法构建他们的应用程序。</span><span>症状是您看到类似的错误消息</span></span><code>Error: unexpected end of file at Zlib.zlibOnError (zlib.js:142:17) errno: -5, code: 'Z_BUF_ERROR' }</code><span>。</span></p>
<p><span><span>可以手动下载所需的文件,然后构建应用程序。</span><span>步骤是:</span></span></p>
<ol>
<li><span>找到您的项目目录,然后找到</span><code>node_modules/realm/vendor/realm-ios</code><span><span>。</span><span>它会是空的。</span></span></li>
<li><code>download-realm.lock</code><span><span>使用以下命令</span><span>创建文件</span><span>:</span></span><code>echo SYNC_SERVER_FOLDER=sync SYNC_ARCHIVE=realm-sync-cocoa-3.7.0.tar.gz SYNC_ARCHIVE_ROOT=core > download-realm.lock</code><span><span>。</span><span>版本号(此处为3.7.0)必须与更改日志中的Realm Sync版本匹配。</span></span></li>
<li><span>找到下载的文件,</span><code>realm-sync-cocoa-3.7.0.tar.gz</code><span>执行此命令</span><code>tar -xzvf realm-sync-cocoa-3.7.0.tar.gz -C yourProjectDirectory/node_modules/realm/vendor/realm-ios</code><span>。</span></li>
<li><span><span>你会发现该目录不再是空的。</span><span>复制目录下的所有文件</span></span><code>core</code><span>并将其粘贴到目录下</span><code>yourProjectDirectory/node_modules/realm/vendor/realm-ios</code><span>。</span></li>
</ol>
<h3 id="crash-reporting"><span>崩溃报告</span></h3>
<p><span><span>我们鼓励您在应用程序中使用崩溃报告器。</span><span>许多Realm操作可能在运行时失败(与任何其他磁盘IO一样),因此从应用程序收集崩溃报告将有助于确定您(或我们)可以改进错误处理和修复崩溃错误的区域。</span></span></p>
<p><span><span>大多数商业崩溃记者都可以选择收集日志。</span><span>我们强烈建议您启用此功能。</span><span>在抛出异常和不可恢复的情况时,Realm会记录元数据信息(但没有用户数据),这些消息可以在出现问题时帮助调试。</span></span></p><br><br>
来源:https://www.cnblogs.com/strengthen/p/11166081.html
頁:
[1]