Создайте глобальный файл Realm для совместного приложения для Android

Мое приложение — это совместное приложение, в котором пользователи должны иметь возможность записывать/читать в глобальный файл Realm, чтобы обмениваться данными между собой. Я также хотел бы включить некоторые исходные данные (realmObjects) в файл Realm, которые будут общими для всех пользователей.

Пользователь зарегистрируется, а затем сможет создавать данные и делиться ими со всеми пользователями. Исходные данные, созданные только один раз, должны быть доступны всем пользователям.

Я не могу назначать права пользователя (запись/чтение) каждому новому пользователю после его регистрации/входа в приложение. Общие данные создаются несколько раз, поскольку запрос (realm.where(realmObject.class).findall() не возвращает результатов, даже если он был создан.

public static final String AUTH_URL     = "http://" + BuildConfig.OBJECT_SERVER_IP + ":9080/auth";
public static final String REALM_URL    = "realm://" + BuildConfig.OBJECT_SERVER_IP + ":9080/default";

Класс UserManager

public class UserManager {

    // Supported authentication mode
    public enum AUTH_MODE {
        PASSWORD,
        FACEBOOK,
        GOOGLE
    }
    private static AUTH_MODE mode = AUTH_MODE.PASSWORD; // default

    public static void setAuthMode(AUTH_MODE m) {
        mode = m;
    }

    public static void logoutActiveUser() {
        switch (mode) {
            case PASSWORD: {
                break;
            }
            case FACEBOOK: {
                LoginManager.getInstance().logOut();
                break;
            }
            case GOOGLE: {
                break;
            }
        }
        SyncUser.currentUser().logout();
    }

    // Configure Realm for the current active user
    public static void setActiveUser(SyncUser user) {
        Realm.removeDefaultConfiguration();
        SyncConfiguration defaultConfig = new SyncConfiguration.Builder(user, REALM_URL).name("Realm").schemaVersion(0).build();
        Realm.setDefaultConfiguration(defaultConfig);
        setDefaultPermissionsRealm(user);
    }

    private static void setDefaultPermissionsRealm(SyncUser user){
        if (user.getIdentity().toString().equals(PRIVILAGE)){

            Realm realm = user.getManagementRealm();
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    Boolean mayRead = true; // Grant read access
                    Boolean mayWrite = true; // Keep current permission
                    Boolean mayManage = false; // Revoke management access
                    PermissionChange change = new PermissionChange(REALM_URL,
                            "*",
                            mayRead,
                            mayWrite,
                            mayManage);
                    realm.insert(change);
                }
            });
        }
    }
}

Всплеск активности

SyncUser.loginAsync(SyncCredentials.usernamePassword(eMail, password, true), AUTH_URL, new SyncUser.Callback() {
                @Override
                public void onSuccess(SyncUser syncUser) {
                    loginRegistrationSuccess = true;
                    registrationComplete(syncUser);
                }

                @Override
                public void onError(ObjectServerError error) {
                    loginRegistrationSuccess = false;
                }
            });

facebookAuthRegistration    = new FacebookAuth((LoginButton) findViewById(R.id.sign_up_facebook), this) {
           @Override
           public void onRegistrationComplete(final LoginResult loginResult, User userInfo) {
               UserManager.setAuthMode(UserManager.AUTH_MODE.FACEBOOK);
               SyncCredentials credentials = SyncCredentials.facebook(loginResult.getAccessToken().getToken());
               SyncUser.loginAsync(credentials, AUTH_URL, SplashScreenActivity.this);
           }
        };

        googleAuthRegistration      = new GoogleAuth((Button) findViewById(R.id.sign_up_google), this, googleAuthLogin.getmGoogleApiClient()) {
            @Override
            public void onRegistrationComplete(GoogleSignInResult result) {
                UserManager.setAuthMode(UserManager.AUTH_MODE.GOOGLE);
                GoogleSignInAccount acct    = result.getSignInAccount();
                SyncCredentials credentials = SyncCredentials.google(acct.getIdToken());
                SyncUser.loginAsync(credentials, AUTH_URL, SplashScreenActivity.this);
            }
        };

@Override
    public void onSuccess(SyncUser syncUser) {
        loginRegistrationSuccess = true;
        showProgress(false);
        registrationComplete(syncUser);
    }

private void registrationComplete(SyncUser syncUser) {
        UserManager.setActiveUser(syncUser);
        Intent mainIntent = new Intent(SplashScreenActivity.this, MainActivity.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        SplashScreenActivity.this.startActivity(mainIntent);
        SplashScreenActivity.this.finish();
    }

Похоже, что если я создаю разные области для каждого пользователя, даже если я не включаю в URL-адрес «~».

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Спасибо


person user274051    schedule 22.05.2017    source источник


Ответы (1)


Первоначально вам нужно будет создать Realm, используя пользователя-администратора, и установить разрешения для всех других пользователей, которые могут получить к нему доступ. Если вы используете версию Pro, вы можете создать Realm с помощью небольшого скрипта node.js. В качестве альтернативы вы можете создать небольшое внутреннее приложение с единственной целью создания Realm с помощью пользователя-администратора.

Пользователям разрешено создавать Realm только в своем домашнем каталоге (так сказать, ~), но они могут делиться им с другими пользователями. При этом вам придется распространять идентификатор пользователя этого первого пользователя.

person geisshirt    schedule 25.05.2017
comment
Спасибо. Я использую версию для разработчиков. Я вхожу в приложение с правами администратора Realm Object Server. Я даже создал нового пользователя в ROS с правами администратора и вошел в приложение. Таким образом, оба пользователя должны иметь право создавать глобальный файл, но глобальный файл не создается. Более того, ROS создает трассировку в логе tap. включу в следующий комментарий - person user274051; 26.05.2017
comment
[прокси] внутренняя ошибка. Код не определен, статус: не определен, сообщение: SyntaxError: неожиданный токен j в JSON в позиции 0 в Object.parse (собственный) в ProxyService.webSocketUpgradeHandler (/usr/lib/nodejs/realm-object-server-developer/.build/src /node/services/proxy.js:104:30) в ProxyService.safeUpgrade (/usr/lib/nodejs/realm-object-server-developer/.build/src/node/services/proxy.js:78:12) в emitThree (events.js:116:13) в Server.emit (events.js:194:7) в onParserExecuteCommon (_http_server.js:411:14) в HTTPParser.onParserExecute (_http_server.js:379:5) - person user274051; 26.05.2017
comment
Очень похоже на stackoverflow.com/questions/44170810/realm-response- статус-400 - person geisshirt; 31.05.2017