存储位置数据的最佳方式-Android



我正在开发一个地理围栏程序,需要保存用户的路径。

到目前为止,我在SharedPreferences中存储了一组字符串,每X分钟,数据就会被发送到服务器并清除所有变量,所以我认为不会有存储问题。

我想知道是否有最好的方法。

更新:只要SharedPreferences不支持List,我就会遵循@cchiastic security的方法,并创建一个具有浮点类型和时间戳的Point类,然后将其添加到Set中。

这是我的代码示例:

SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
ArrayList<String> path;

public void updatePath(Points point){
        path.add(point);
        Set<String> mySet = new HashSet<String>(path); 
        prefs.edit().putStringSet("path", mySet).commit();
    }

和点数类

 public class Points {
            private Double[] coordinates;
            private long timestamp;
            public Points(Double[] coordinates ){
                this.coordinates = coordinates;
                this.timestamp = System.currentTimeMillis();
            }

如果存储路径,则应该存储List而不是Set,否则将丢失排序。这将是一个混乱的点,而不是你可以随着时间的推移追踪的东西。

因为我们不知道point中有什么,所以不可能再多说了,但String似乎是一个奇怪的选择。我希望有一个自定义类,可以存储纬度和经度以及可能的海拔高度(double)。它还可能存储时间戳(long),如果是这样,那么Set就可以了,因为您可以恢复排序(尽管List仍然更自然)。

您需要确保该类实现Parcelable

如果有多个首选项,可能会更好地使用sqlite来存储和检索位置。这是一个如何在sqlite上存储数据的简单示例。http://www.vogella.com/tutorials/AndroidSQLite/article.html

我希望它对你有效

由于长共享首选项只允许我们使用intbooleanStringSet<String>,我最终使用了ComplexReferences。

它允许我们使用我们想要使用的每一种数据结构。

在我的例子中,我使用了对象数组Point,因为我们需要在发送信息之前完成一个缓冲区。

ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", Context.MODE_PRIVATE);
Points[] path = new Points[N_POINTS];
void addObj(){
    complexPreferences.putObject("path", path);
    complexPreferences.commit();
}

最新更新