代码之家  ›  专栏  ›  技术社区  ›  Abhishek kumar

存储字符串键值对

  •  6
  • Abhishek kumar  · 技术社区  · 7 年前

    我正在开发一个android应用程序,应用程序的主要工作是有一个扫描仪,我必须再次扫描&再次将结果存储在键值对中。

      [
       {
        "0" : "816444014066",
        "1" : "747083010945",
        "2" : "816444010969"
      }
     ]
    

    通过API,我必须按数组发送所有扫描结果。 我正在通过startActivityForResult的另一个活动获得扫描结果。用户将一次又一次地扫描,通过onActivityResult用户将得到结果。我必须将所有结果存储在键值对中,最后有一个按钮,点击按钮,按POST请求,我必须通过数组发送所有扫描结果,如上面的代码。

    我可以在这里使用HashMap还是必须使用共享首选项来存储结果。

    // Call Back method  to get the Message form other Activity
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            // check if the request code is same as what is passed  here it is 2
            if (requestCode == 2 && data!=null) {
                String message = data.getStringExtra(SCAN_RESULT);
                // textView1.setText(message);
                if(message!= null){
                    Log.e("SCAN_RESULT", "" + message);
    
                    //Adding code will be here
    
    
                  }
            }
        }
    
    9 回复  |  直到 7 年前
        1
  •  10
  •   SepJaPro2.4    7 年前

    以下是使用hashmap保存键值的示例代码:

    HashMap<String, String> data = new HashMap<String, String>();
    data.put("key", "value");
    

    或者,如果您使用linkedHashMap与订单有关:

    HashMap<String, String> data = new LinkedHashMap<>();
    

    用法相同;)

        2
  •  7
  •   Bahadir Tasdemir    6 年前

    数据结构逻辑:

    哈希映射用于通过其键访问内容。

    在这个示例中,我猜您正在逐个扫描“元组”,每个元组都不同,因此您不需要通过它的键访问旧元组。

    因此,我建议您创建适合键值对的模型类,并将其存储在列表中。完成后,您可以推送该列表。

    元组的示例模型:

    public class KeyValuePair {
        private String key;
        private String value;
        public KeyValuePair(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }
    

    要存储的示例列表:

    List<KeyValuePair> keyValuePairList = new ArrayList<>();
    keyValuePairList.add(new KeyValuePair("0", "816444014066"));
    keyValuePairList.add(new KeyValuePair("1", "747083010945"));
    keyValuePairList.add(new KeyValuePair("2", "816444010969"));
    

    存储:

    如果无法在活动之间传递数据,请签出 SQLite . 您可以将数据存储在SQLite中,并在需要时提取数据。它是一个在Android设备上工作的离线数据库。推送到上游时可以删除数据。

    编辑:

    如果键是顺序,则可以简单地使用如下字符串列表:

    List<String> keyValuePairList = new ArrayList<>();
    keyValuePairList.add("816444014066");
    keyValuePairList.add("747083010945");
    keyValuePairList.add("816444010969");
    
        3
  •  2
  •   Araju    7 年前

    使用hashmap存储数据,然后使用Gson将hashmap转换为字符串,然后将其保存到SharedPrefs

    private void hashmaptest()
    {
        //create test hashmap
        HashMap<String, String> testHashMap = new     HashMap<String, String>();
    testHashMap.put("key1", "value1");
    testHashMap.put("key2", "value2");
    
    //convert to string using gson
    Gson gson = new Gson();
    String hashMapString = gson.toJson(testHashMap);
    
    //save in shared prefs
    SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
    prefs.edit().putString("hashString", hashMapString).apply();
    
    //get from shared prefs
    String storedHashMapString = prefs.getString("hashString", "oopsDintWork");
    java.lang.reflect.Type type = new TypeToken<HashMap<String, String>>(){}.getType();
    HashMap<String, String> testHashMap2 = gson.fromJson(storedHashMapString, type);
    
    //use values
    String toastString = testHashMap2.get("key1") + " | " + testHashMap2.get("key2");
    Toast.makeText(this, toastString, Toast.LENGTH_LONG).show();
    }
    

    资料来源: Saving a hash map into Shared Preferences

        4
  •  2
  •   Yamen Nassif    7 年前

    好的,如果你想保存存储的键值以防用户关闭应用程序,那么你需要使用以下选项之一:sqllite、file、SharedPreferences。但是,如果用户关闭应用程序并重新启动它,那么它将是新的(键值),然后你只需简单地使用如下HashMap:

    Map <Integer,String> hashMap = new HashMap<Integer,String>();

        5
  •  1
  •   jorjSB    7 年前

    为此,最好使用哈希映射来存储非持久性数据。由于您正在发布结果,因此不需要共享首选项,因此不需要持久存储。

    类似这样:

    Map <Integer,Integer> myMap = new HashMap<Integer,Integer>();
    
        6
  •  1
  •   dalla92    7 年前

    如果您需要应用程序中其他地方的扫描结果,我建议您使用SharedReferences并放置键值对。 否则,只需使用HashMap。

    建议:如果需要保持键值对的顺序,请使用LinkedHashMap并对其进行迭代。

        7
  •  1
  •   Rajan Kali    7 年前

    如果您使用整数作为键,那么最好使用 SparseArray 结束 HashMap 因为它使用原语键存储数据,并且比hashMap更快。

     SparseArray<String> spa = new SparseArray();
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            // check if the request code is same as what is passed  here it is 2
            if (requestCode == 2 && data!=null) {
                String message = data.getStringExtra(SCAN_RESULT);
                // textView1.setText(message);
                if(message!= null){
                    //Adding code will be here 
                    spa.put(key,value);
                  }
            }
        }
    
        8
  •  1
  •   Skizo-ozᴉʞS ツ    7 年前

    SharedPreferences 用于存储小数据,因此我建议您将其存储在 File 稍后再阅读。。。(如果你的数据很大)

    首先创建一个 Object ,例如 HashMap<String,String> 具体如下:

    HashMap<String, String> data = new HashMap<String, String>();
    data.put("0", "816444014066");
    ...
    

    现在,您可以创建这些方法来存储信息:

    public static synchronized void saveData(Context context, Object object, String filename) {
            try {
                String tempPath = context.getFilesDir() + "/" + filename+ ".bin";
                File file = new File(tempPath);
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
                oos.writeObject(object);
                oos.flush();
                oos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    然后,如果你想读取数据,你只需这样做:

    public static synchronized Object readData(Context context, String filename) {
            Object obj = new Object();
            try {
                String tempPath = context.getFilesDir() + "/" + binFileName + ".bin";
                File file = new File(tempPath);
                if (file.exists()) {
                    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
                    obj = ois.readObject();
                    ois.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return obj;
        }
    
        9
  •  1
  •   Abhishek kumar    7 年前

    在扫描结果之后,我在中创建了一个方法,我在HashMap中逐个添加所有扫描结果。

     LinkedHashMap<String, String> data = new LinkedHashMap<String, String>();
    
      // Call Back method  to get the Message form other Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // check if the request code is same as what is passed  here it is 2
        if (requestCode == 2 && data!=null) {
            String message = data.getStringExtra(SCAN_RESULT);
           if(message!= null){
                Log.e("SCAN_RESULT", "" + message);
                showBarCodeContentDialoig(message);
                storeScanValue(scanResult);
            }
        }
    }
    

    onCreate()的外侧;

     private void storeScanValue(String scanResult) {
        count++;
        data.put(String.valueOf(count), scanResult);
        Log.e("Key_Value",""+count);
        Log.e("SIZE",""+data.size());
      }
    

    将结果从一个活动发送到另一个活动:

     Gson gson = new Gson();
        String list = gson.toJson(data);
        Intent intent = new Intent(AdjustInventoryCount.this, AdjustInventory.class);
        intent.putExtra("list", list);
        startActivity(intent);
    

    对于从以前的活动接收数据:

    String str=  getIntent().getStringExtra("list");
        Gson gson = new Gson();
    
        Type entityType = new TypeToken< LinkedHashMap<String, String>>(){}.getType();
        data = gson.fromJson(str, entityType);
    
        String jsonList = gson.toJson(data, LinkedHashMap.class);
    
        Log.e("list", ""+jsonList);
        Log.e("Size", ""+data.size());
    

    通过这种方式,我得到了存储在LinkedHashMap中的原始序列结果。