2017-05-22 37 views
1

我的應用程序是一個協作應用程序,用戶應該能夠將其寫入/讀入全局Realm文件以在它們之間共享數據。我還想在Realm文件中包含一些初始數據(realmObjects),這對所有用戶都是通用的。爲協作android應用程序創建一個全局領域文件

用戶將註冊,然後能夠創建數據並與所有用戶共享數據。初始數據只創建一次,應該可供所有用戶使用。

一旦他們在應用中註冊/登錄,我就無法爲每個新用戶分配用戶權限(寫入/讀取)。因爲查詢的公共數據創建的多個時間(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); 
       } 
      }); 
     } 
    } 
} 

SplashActivity

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中包含「〜」,每個用戶也是如此。

有人能告訴我我做錯了什麼嗎?

感謝

回答

0

首先,你需要創建使用管理用戶的境界,和所有其他用戶的權限設置可以訪問它。如果您正在使用Pro版本,則可以使用小型node.js腳本創建Realm。或者,您可以創建一個小型內部應用程序,其目的是使用管理員用戶創建領域。

用戶只能在其主目錄(~)內創建Realm,但他們可以與其他用戶共享。這樣做,您將不得不分發第一個用戶的用戶標識。

+0

謝謝。我正在使用開發者版本。我正在使用Realm Object Server Admin用戶登錄應用程序。我甚至使用管理員權限在ROS中創建了一個新用戶,並登錄到應用程序中。因此,兩個用戶都應該有權創建一個全局文件,但是不會創建全局文件。此外,ROS正在日誌中創建一個跟蹤。我將在下一條評論 – user274051

+0

中包含[proxy]內部錯誤。代碼未定義,狀態:未定義,消息:SyntaxError:JSON位置0處的意外標記j在ProxyService.webSocketUpgradeHandler的Object.parse(native)處(/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)在HTTPParser.onParserExecute(_http_server.js:379:5)上的onParserExecuteCommon(_http_server.js:411:14)處的Server.emit(events.js:194:7)處的emitThree(events.js:116:13) – user274051

+1

非常像https://stackoverflow.com/questions/44170810/realm-response-status-400 – geisshirt

相關問題