当前位置: 首页 > 知识库问答 >
问题:

如何在SharedPreferences中存储和检索位置对象?

仉联
2023-03-14

我正在使用这段代码,但当我从首选项获得位置时,位置返回如下所示...

位置[mprovider=存储,Mtime=0,mlatitude=30.0,montilunde=76.0,mhasaltitude=false,maltitude=0.0,mhasspeed=false,mspeed=0.0,mhasbearing=false,mbearing=0.0,mhasaccuracy=false,maccuracy=0.0,mextras=null]

/** Store Location object in SharedPreferences */
public void storeLocation(Context context, Location location) {
    SharedPreferences settings;
    Editor editor;
    try {
        JSONObject locationJson = new JSONObject();
        locationJson.put(LATITUDE, location.getLatitude());
        locationJson.put(LONGITUDE, location.getLongitude());

        settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
        editor = settings.edit();

        editor.putString(KEY_LOCATION, locationJson.toString());
        editor.commit();
        Log.i("location_util_store", "Location" + location);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/** Retrieve Location object from SharedPreferences
 * @return */
public Location getPrevLocation(Context context) {

    SharedPreferences settings;
    try {
        settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
        String jsonLocation = settings.getString(KEY_LOCATION, null);
        if (jsonLocation != null) {

            JSONObject locationJson = new JSONObject(jsonLocation);
            Location location = new Location("STORAGE");
            location.setLatitude(locationJson.getInt(LATITUDE));
            location.setLongitude(locationJson.getInt(LONGITUDE));
            Log.i("location_util_get", "Location" + location);
            return location;
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

共有1个答案

仲孙铭
2023-03-14

最佳解决方案:提取位置lat和long参数为字符串,并将它们保存在prefs中。根据您的使用情况,您也可以从位置提取其他信息。

正在保存位置:-

        if (location == null) {
            sharedPreferences.edit().removeKey("LOCATION_LAT").apply();
            sharedPreferences.edit().removeKey("LOCATION_LON").apply();
            sharedPreferences.edit().removeKey("LOCATION_PROVIDER").apply();
        } else {
            sharedPreferences.edit().putString("LOCATION_LAT", String.valueOf(location.getLatitude())).apply();
            sharedPreferences.edit().putString("LOCATION_LON", String.valueOf(location.getLongitude())).apply();
            sharedPreferences.edit().putString("LOCATION_PROVIDER", location.getProvider()).apply();
        }

重新调整位置:-

        String lat = sharedPreferences.getString("LOCATION_LAT", null);
        String lon = sharedPreferences.getString("LOCATION_LON", null);
        Location location = null;
        if (lat != null && lon != null) {
            String provider = sharedPreferences.getString("LOCATION_PROVIDER", null);
            location = new Location(provider);
            location.setLatitude(Double.parseDouble(lat));
            location.setLongitude(Double.parseDouble(lon));
        }
        return location;

坏的解决方案:改用Gson持久化您的位置:

String json = location == null ? null : new Gson().toJson(location);
sharedPreferences.edit().putString("Location", json).apply();

正在检索位置:

String json = sharedPreferences.getString("location", null);
return json == null ? null : new Gson().fromJson(json, Location.class);

正如这个答案中提到的。

这不应该崩溃,但它在某些设备上崩溃。正如这里提到的。

 类似资料:
  • 我正在尝试使用RSA加密数据。到目前为止一切都很好。我可以生成私钥-公钥,我可以加密和解密字符串成功。现在我要在SharedPreference中存储公钥。我可以把它存储为字符串。我可以把它作为字符串检索出来。我需要把它转换成密钥,然后传递给密码。未发生从字符串到原始格式的转换。 这是我试过的 这里,我面临的问题是cipher.init(cipher.encrypt_mode,publicKey)

  • 在我的活动中,用户有一个他选择的图像数组,然后我想将它们存储在首选项中。然后用户离开活动,回来时,我希望这些图像仍然加载到ImageView中。我试图使用Gson来完成这一点,但我遇到了麻烦,看不出我做错了什么。希望外界的洞察力能帮助我找到这个显而易见的答案,我只是没有看到。 谢谢你。 这是我到目前为止的代码。

  • 我正在尝试创建一个新的类,它将包含用于Selenium测试的所有变量。以下是课程: 类:VariablesRepo: 我们如何解决这个问题并从Repo类导入变量? 更新:我得到的errorstack是:

  • 问题内容: 我将如何存储my_dict并使用Redis进行检索。例如,以下代码不起作用。 问题答案: 您可以通过(使用来设置多个键)来做到这一点。

  • 我有一个Base64编码的字符串(这是AES加密的字符串)。我正试图将它存储在Firebase存储,然后从它下载。 我尝试过多种选择,例如 这不会在存储中保留base64字符串,而是将其转换为整数。我还尝试提供{contenttype:“application/base64”},但是putString似乎不起作用。 我只是在寻找一个非常简单的base64编码字符串到firebase存储的上传和下载

  • 问题内容: 如何在SQLite中存储和获取图像以及以什么格式保存图像?如果用一个例子来解释会更有用。 问题答案: 图像本身无法存储到数据库列中,但是您可以先将其转换为字符串,然后再存储。该字符串称为base64字符串。据我所知,任何图像都可以转换为相反的图像。 编码为基数64: 现在,您的UIImage对象将转换为String!将strBase64保存到SQLite DB。记住要用作列类型,因为此