我正在开发一个地理围栏程序,需要保存用户的路径。
到目前为止,我在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
我希望它对你有效
由于长共享首选项只允许我们使用int
、boolean
、String
和Set<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();
}