last day (15 days later) » 

10:41 PM
0
Q: Deletar específico valor de uma key com SharedPreferences

RafaelGalera, estou com dificuldades para apagar uma String salva com SharedPreferences. Já vi tudo que é tutorial e não consegui resolver. Seguinte...Meu app é um Google Maps API V2 e tenho os Marker(Marcadores) com snippet(Descrição do marcador) no mapa. Tudo salva conforme eu quero com: locationCo...

 
Rafael, detalhes seria uma chave que você armazena dados no SharedPreferences, correto? Usar getSharedPreferences("detalhes"...) não adianta. Porque está criando um novo arquivo (um xml) de SharedPreferences com esse nome. Cada SharedPreferences possui o seu conjunto de chaves/valores e possui um identificador associado (o primeiro parâmetro ou o getDefaultSharedPreferences para pegar o padrão). O que você precisa fazer é usar o método remove do SharedPreferences.Editor no SharedPreferences original.
 
@Wakim, continue me ajudando por favor, seguinte...Editei minha pergunta pelo que você respondeu. Poderia dar um exemplo para mim? Preciso deletar um valor de uma chave, no caso, detalhes!
 
Pelo que entendi você não chega a adicionar um Marker com chave "detalhes" e sim detalhes+(locationCount-1), tem certeza que tem uma chave com valor "detalhes"? Seguindo a lógica você deveria remover também as chaves "lat+...", "long+..." (assim removendo todos os dados do marker). A princípio isso deveria funcionar se você estiver manipulando o mesmo SharedPreferences (com mesmo identificador).
 
@Walkim, eu uso o (locationCount-1) para que seja identificado no for(int i=0;i<locationCount;i++){ detalhes = sharedPreferences.getString("detalhes"+i,"0"); } A POSIÇÃO CERTA DE UMA DESCRIÇÃO NO MARKER. Tudo funciona!
 
Então o certo não seria apagar as chaves: "detalhes+<i>", "lat+<i>" e "long+<i>" para remover todos os dados de um determinado marker? Pelo que entendi "detalhes" é o seu identificador do SharedPreferences ou estou enganado, se não for poderia incluir o código que recupera a instância do SharedPreferences?
 
10:41 PM
@Wakim, editei a pergunta.
Boa noite, Grande Walkin!
 
Boa Noite, estou com alguns problemas pra entender o código hehe
Tem alguma razão para criar um SharedPreferences para cada item do for?
Entendi que você grava os dados usando o índice, então a princípio não tem colisão e não seria necessário criar um SharedPreferences para cada índice
 
Tem certeza? Estamos falando de Google maps e de marker. Não seria necessário?
 
Pelo que entendi do código você itera sobre a lista de markers, correto?
E grava alguns dados a partir do marker no SP
 
Isso. Cada marker é um locationCount e por isso preciso de um índice para identificar a long, lat e descricao de cada um.
 
Mas para cada gravação você diferencia a chave usando o índice do for.
 
10:47 PM
ISSO!
 
você usa um "salt", com isso eu acredito que não vá ter colisão
 
Exatamente
 
você faz isso tudo com a mesma instância do SP, na remoção você precisa usar a mesma instância
 
Até aí tude bem, mas como referenciar isto? Tipo...preciso apontar para remover o dado de uma key, com um dado!
 
e usar as mesmas chaves ("detalhes+<i>", e etc...) pra remover desse SP
hmmm
 
10:49 PM
Eu preciso usar o dado para identificar ele mesmo
 
hmm, entendi o problema
 
E apagar ele mesmo
:)
 
você quer obter a chave a partir do objeto Marker
 
isso!!!
Mas não esqueça
 
Deixa eu ler a pergunta pra ver se eu pulei algo...
 
10:50 PM
o objetivo
é apagar um DADO
em UMA CHAVE
Apagar os dados de uma chave com um dado, DESTA CHAVE.
 
O Marker tem algum identificador único?
Deixa eu ver na documentação
 
Tem isto: public LatLng (double latitude, double longitude)
Uso para obter a latitude e longitude
com isto: location = new LatLng(position.latitude, position.longitude);
 
Tem duas alternativas:
 
?
 
Ou usa a Latitude e Longitude na chave, como você citou
 
10:54 PM
uhum
 
opá!
 
Mas tenho uma dúvida ao usar isso
ele gera um ID único quando você chama addMarker
Se você fechar o app e abrir denovo, gerando o mesmo marker, ele vai ter um ID diferente
 
também
sharedPreferences = getSharedPreferences("detalhes", 0);
sharedPreferences.edit().remove(detalhes).commit();
Queria algo como isto!
 
Acho que é melhor concatenar a Lat e Long na chave, é mais garantido.
 
10:56 PM
como?
 
quando você iterar nos Markers
 
Eu já tenho a long e lati com:

for(int i=0;i<locationCount;i++){

// Obtendo a laitude
lat = sharedPreferences.getString("lat"+i,"0");

// Obtendo a longitude
lng = sharedPreferences.getString("lng"+i,"0");
 
Entendi, você guarda nesse formato pra poder iterar depois usando o "locationCount".
Se mudar vai ficar complicado iterar...
 
Com isso, você consegue obter a posição da chave?
 
Acho que você vai precisar criar/manter um índice.
que mapeia Marker -> posição (i), usando a latitude e longitude.
 
10:59 PM
cara, é uma entrevista de emprego isso kkk PRECISO RESOLVER HOJE!
FALTA SOMENTE ISSO
kk
ME AJUDA!
 
Nossa...
A minha sugestão então é guardar tudo em um JSON
e persistir em arquivo ou em SP mesmo
com JSONObject você consegue iterar nas chaves
 
refazer tudo?
 
+-
só teria que usar um JSONObject pra inserir as chaves, criando o índice também nele se quiser.
e no final guardar o JSONObject.toString() no SP
 
Em array?
 
É melhor usar Objeto mesmo
 
11:04 PM
"results":[
{
"lat":"value",
"lon":"value"
},
{
"lat":"value",
"lon":"value"

}
]
 
Pode ser, mas você precisaria fazer uma busca pra remover
 
Como seria da forma que vc ta pensando?
Em Objeto, como seria?
 
Até que a sua forma é melhor...
Você só precisaria implementar um algoritmo de busca
Pra achar a posição baseada no "lat/lon"
No caso do JSONObject, você consegue iterar sobre as chaves
sem saber a princípio como elas são...
Se você gerar uma chave baseada na lat/lon do Marker, é só acessar direto e remover
Com o JSONObject da pra fazer os dois, iterar e remover
 
SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);

Sabe dizer o que é name_icons_list? É uma chave?
 
É um identificador do SP
 
11:08 PM
O que isso faz?

SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
 
Com isso ta editando um SP com identificador "name_icons_list"
 
E complementando com isto?:

for (String s : nameIcons.keySet()) {
// use the name as the key, and the icon as the value
keyValuesEditor.putString(s, nameIcons.get(s));
}
keyValuesEditor.commit()
Olha isso:

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#putStringSet%28java.lang.String,%20java.util.Set%3Cjava.lang.String%3E%29
 
Interessante, mas cuidado porque só vai funcionar na API 11
em diante
Mas o Set só pode ser de tipo primitivo
String, Double, Integer (Objetos Serializable).
Ah não, só String mesmo
Da uma olhada nessa pergunta: stackoverflow.com/questions/20416131/…
 
hum
 
tem um código explicando como serializar um JSON em SP. Mas tenha cuidado, porque SP é feito para coisas pequenas.
Se tiver um tempo antes de enviar a solução, ve se não é melhor gravar em arquivo.
 
11:21 PM
uhum. SP`é recomendando?
é antigo?
 
SP é recomendado para guardar pequenas quantidades de dados
são mais para preferencias de usuário, configurações
Usar arquivo nesses casos é mais adequado, talvez seja um ponto que o avaliador veja.
 
parece que só há isto:

editor.remove(String key);
editor.commit();
:(
 
Sim, mas ai você não precisa remover o JSON do SP, só remover a chave relativa ao Marker do JSONObject
Você só vai precisar guardar/recuperar uma coisa na SP, o JSON
depois de recuperar o JSON é só usar ele pra remover/adicionar os Markers.
 
então resumindo o SP seria uma referência dentro do Json? Como um ponteiro?
 
contrário
 
11:27 PM
o.O
 
você guardaria o JSON na SP
e usaria o JSONObject para guardar os dados
JSON é uma notação para objetos
 
com JSONObject guardaria os dados no SP ?
 
você manipula o JSONObject como se fosse um HashMap, adicionando chaves e removendo. E salvaria o JSONObject (toString) na SP (formato JSON).
 
hummmmmm
 
Mas no caso, você consegue tanto iterar (não tem garantia de ordem) e consegue acessar um valor com a chave.
Se você gerar a chave com os dados de Lat/Long do Marker, você consegue recupera-lo sem problemas do JSONObject.
 
11:30 PM
Então a questão é o escopo dos dados? em json eu recuperaria esses dados ou removeria mais fácil, pois a referenia seria o próprio json
 
isso
O JSON ficaria no escopo da SP.
 
entendi
 
Recuperando o JSON você consegue construir o JSONObject e manipula-lo fácilmente.
 
Em que formato?
 
String
Usando o método toString no JSONObject, você gera uma String (formato json) a ser salva no SP.
 
11:36 PM
Poderia criar um exemplo de como eu faria isso, utilizando lat, longi e descricao? AJUDARIA MUITO PARA EU PODER SEGUIR EM FRENTE
se eu tivesse usando sqliter? Era melhor?
 
Sim, seria melhor
Seria o melhor caso, usando um ContentProvider
Usando o SQLite você nem precisaria de JSON
 
11:55 PM
DESCOBRI ALGO MUITO IMPORTANTE!
:))))
 

  last day (15 days later) »