我遇到了在React Native中处理多个领域的问题。我正在开发一款应用程序,允许用户在没有订阅的情况下使用应用程序(使用本地领域),然后在应用程序旅程中的任何时候,他们都可以选择升级到具有同步功能的订阅(使用同步到领域对象服务器)。
当我启动应用程序时,我会检查他们是否正在使用同步,如果是这样,我会使用他们的用户初始化同步域,一切都很好。我得到了我期望的所有数据。
然而,当应用程序在安装后第一次启动时启动(关于安装后首次启动的那部分至关重要)并且我发现他们没有使用同步我初始化一个本地域我保存数据直到他们决定登录到他们的同步帐户(如果有的话)。此时我尝试从同步域中提取信息,但它没有我在初始化同步域时看到的信息(在app启动时我检测到它们使用同步)。
我能够以同步用户身份登录,但如果我之前已初始化本地域,那么数据就不存在。此逻辑在安装后首次启动应用时运行。当我在应用程序的辅助启动时初始化本地和同步域时,数据仅显示在领域对象服务器上(在启动之前不重新安装)。
这是一个简单的测试脚本,其中包含虚拟数据,我已经能够复制观察到的行为:
const username = 'testuser2';
const password = 'supersecret';
const tld = 'REALM_OBJECT_SERVER_TLD';
class Test extends Realm.Object {}
Test.schema = {
name: 'Test',
properties: {
id: {
type: 'string',
},
}
};
function initLocalRealm() {
return new Realm({
path: 'local.realm',
schema: [Test],
});
}
function initSyncedRealmWithUser(user) {
return new Realm({
path: 'synced.realm',
sync: {
user,
url: `realm://${tld}:9080/~/data`,
},
schema: [Test],
});
}
function writeTestObjectWithId(realm, id) {
realm.write(() => {
realm.create('Test', {
id,
});
alert(`Test object with id: ${id}`);
});
}
initLocalRealm();
// setup
// uncomment this and comment out the login section to setup user on first run
// Realm.Sync.User.register(`http://${tld}:9080`, username, password, (error, user) => {
// if (error) {
// return;
// }
// const syncedRealm = initSyncedRealmWithUser(user);
// writeTestObjectWithId(syncedRealm, '1');
// });
// login
Realm.Sync.User.login(`http://${tld}:9080`, username, password, (error, user) => {
if (error) {
return;
}
const syncedRealm = initSyncedRealmWithUser(user);
alert(`Synced realm test objects: ${syncedRealm.objects('Test').length}`);
});
如果您创建一个react native应用程序,然后将此代码添加到主要组件componentDidMount
功能,您应该会在应用程序的第一次运行时看到(在您注册一次注册代码之后)将看到Test集合长度为0,但是当您刷新时,您将看到Test集合长度为1。
对此的任何帮助都会很棒。
谢谢!
答案 0 :(得分:0)
运行你的代码片段,一旦取消注册登录部分,我会立即得到1的长度。您是否可以尝试使用Realm Browser观察同步领域,并在注册用户后查看它是否具有您期望的数据?