在SharedPreferences

时间:2016-11-14 22:53:41

标签: android android-sharedpreferences

我有一个从API获得的商店列表。每个人都有不同的ID和名称(以及其他参数)。用户可以在每个用户登录,当他们这样做时,他们需要保持登录,无论如何,直到他们最终退出。我想到的是,在SharedPreferences中保存商店的数量/ ID并将用户登录。然后,当我检查用户是否登录时,我检查在SharedPreferences中保存的商店编号是否与他们当前所在商店的数量/ ID。如果是,他们会登录,如果没有他们没有登录。问题是,如果他们登录到另一个商店,SharedPreferences将被覆盖的数字/ ID另一家商店。所以,基本上,这种方式只能在一个商店登录。如何才能让我在SharedPreferences中购物并以某种方式检查他们之后是否在正确的商店登录?

登录商店

@Override
public void loginShop(final Shop shop, UserInfo userInfo, final Callback<Shop> callback) {
    ShopLoginBody body;
    body = map(shop, userInfo);
    mCallLogin = App.getRestClient().getApiService().shopLogin(body);
    mCallLogin.enqueue(new retrofit2.Callback<ShopLoginResult>() {
        @Override
        public void onResponse(Call<ShopLoginResult> call, Response<ShopLoginResult> response) {
            int loginNumber;
            int customerNumber;
            Result<Shop> result = new Result<>();

            if (response.code() != 200) {
                try {
                    JSONObject objError = new JSONObject(response.errorBody().string());
                    Error error = new Error();
                    error.setErrorMessage(objError.getString("errorMessage"));
                    error.setErrorCode(objError.getInt("errorCode"));
                    callback.onFailure(error);
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return;
            }

            loginNumber = response.body().getLoginNumber();
            customerNumber = response.body().getCustomerNumber();

            mPreferenceAdapter.writeShopNumber(shop.getId());
            mPreferenceAdapter.writeLoginNumber(loginNumber);
            mPreferenceAdapter.writeClientNumber(customerNumber);
            mPreferenceAdapter.writeIsLoggedIn(true);
            mPreferenceAdapter.apply();

            shop.setLoginId(loginNumber);
            shop.setCustomerId(customerNumber);
            ShopRepository shopRepository = new ShopRepository();
            shopRepository.updateLoginNumber(shop);
            result.setData(shop);
            callback.onSuccess(result);
        }

        @Override
        public void onFailure(Call<ShopLoginResult> call, Throwable t) {

        }
    });
}

我稍后如何查看

    isLoggedIn = mPreferenceAdapter.readIsLoggedIn();
    shopNumber = mPreferenceAdapter.readShopNumber();
    if (shopNumber == mShop.getId() && isLoggedIn) {
        menu.findItem(R.id.action_login).setVisible(false);
        menu.findItem(R.id.action_logout).setVisible(true);
    } else {
        menu.findItem(R.id.action_login).setVisible(true);
        menu.findItem(R.id.action_logout).setVisible(false);
    }

1 个答案:

答案 0 :(得分:0)

我想,

SharedPreferences不是您数据结构的最佳存储空间。但是要解决您的情况,您可以将登录商店列表序列化为JSON字符串,然后将其存储到首选项中。

prefs.edit().putString("auth-shops", new Gson().toJson(shops)).apply();