我必须使用Keyset将HashMap值存储在SQLite上,并在使用共享首选项重新启动应用程序时重用。
HashMap<Integer, ArrayList<String>> hashMap;
hashMap = new HashMap<>();
//Insert Value
hashMap.put(btn.getId(), listValue);
// Read a Value
Map.Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iteratorMap.next();
for (Integer ihashId :hashMap.keySet()) {
if( btnid == ihashId)
{
Set<Map.Entry<Integer, ArrayList<String>>> setMap = hashMap.entrySet();
Iterator<Map.Entry<Integer, ArrayList<String>>> iteratorMap = setMap.iterator();
while (iteratorMap.hasNext()) {
Map.Entry<Integer, ArrayList<String>> entry = (Map.Entry<Integer, ArrayList<String>>) iteratorMap.next();
ArrayList<String> values = entry.getValue();
if (btnId == entry.getKey()) {
getSetName.setText(values.get(0));
getSetAddress.setText(values.get(1));
getSetPin.setText(values.get(2));
getSetValue.setText(values.get(3));
}
}
}
答案 0 :(得分:0)
编辑问题之前的原始答案:
HashMap已经序列化,因此您可以将HashMap作为BLOB直接存储在sqlite数据库中。虽然在您对其进行反序列化之前,您无法阅读其内容。
编辑:
您应该将长时间运行的操作放在异步任务中。如果您希望变量的引用能够在配置更改后继续存在,那么您应该使用片段并使用setRetainInstance(true)
,但无论是否保留对AsyncTask的引用,它都独立于UI线程并将继续运行。
侧面注意:
使用ArrayList时始终使用手动计数循环,因为它具有更好的性能。
如this comparison所示,使用具有设置为数组大小的计数器的for循环要比每个循环快得多:
private static List<Integer> list = new ArrayList<>();
for(int j = list.size(); j > size ; j--)
{
//do stuff
}