33

I been following online tutorials on how to insert data into a database from an android app and have everything working except this small part

List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));

NameValuePair and BasicNameValuePair have been deprecated in favor of openConnection(). How can I create a new-value association with that? http://developer.android.com/reference/java/net/URL.html#openConnection()

Does anyone know how I can create name value pairs with openConnection? I been searching everywhere.

Sergey Glotov
  • 20,200
  • 11
  • 84
  • 98
user1949387
  • 1,245
  • 3
  • 21
  • 38

7 Answers7

45

I just ran into the same problem. The deprecated classes from org.apache.http have been removed in API 23.

I ended up using android.util.Pair. It works perfectly, and the code is shorter too:

List<Pair<String, String>> params = new ArrayList<>();
params.add(new Pair<>("username", username));
params.add(new Pair<>("password", password));
friederbluemle
  • 33,549
  • 14
  • 108
  • 109
  • 1
    Thanks, there is also a support library implementation for backwards compatibility – Daniel Wilson Jan 15 '16 at 12:53
  • This is the correct way to achieve this in API level 23 – anubhav16 Feb 24 '16 at 13:35
  • One thing to note here: Using `android.util.Pair` will create a dependency on the Android framework, so if you want "plain Java" objects that are easily unit testable etc. you can simply use `Map` - although that does not allow duplicate keys (which is possible for HTTP headers according to [RFC2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)). – friederbluemle Oct 04 '16 at 03:40
  • 1
    Just to add if you want to get the values as in the example above you can use (String) params.first and (String) params.second – Sybregunne Nov 01 '16 at 08:33
  • this seems to be the better alternative and hence the accepted answer IMHO. – Ritesh Gune Nov 18 '19 at 06:00
32

You can use ContentValues, for example:

ContentValues values = new ContentValues();
values.put("username", name);
values.put("password", password);
database.insert(Table_name, null, values);
Community
  • 1
  • 1
Menna-Allah Sami
  • 580
  • 4
  • 19
  • 10
    `ContentValues` has been design in order to be used by contentresolver NOT network communications - which the question is based on - since there is no `getName()` and `getValue()` methods in case you need to parse header attributes. – Hesam Aug 19 '15 at 09:28
  • @Hesam you can get the name and values from ContentValues http://stackoverflow.com/a/32559098/4552938 – Fahim Sep 14 '15 at 07:15
  • 1
    To me creating an iterator to get the key-values like that seems like marginally extra overhead - I prefer @friederbluemle 's answer below – Daniel Wilson Jan 15 '16 at 12:51
7

Alternate to NameValuePair. Also you can get the name and values from it as mentioned below. Here key isa name.

Create:

ContentValues values = new ContentValues();
values.put("key1", "value1");
values.put("key2", "value2");

Get key and value :

for (Map.Entry<String, Object> entry : values.valueSet()) {
    String key = entry.getKey(); // name
    String value = entry.getValue().toString(); // value
}
Fahim
  • 12,198
  • 5
  • 39
  • 57
2

you can use contentvalues or hashmap based on your preference.

i have used Content values

ContentValues contentValues = new ContentValues();
contentValues.put("key1","value1");
contentValues.put("key2","value2");

and if the data that u are posting is form data then here`s how u can convert it form data

 public String getFormData(ContentValues contentValues) throws UnsupportedEncodingException {

    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, Object> entry : contentValues.valueSet()) {
        if (first)
            first = false;
        else
            sb.append("&");

        sb.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        sb.append("=");
        sb.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
    }
    return sb.toString();
}
ked
  • 2,426
  • 21
  • 24
1

You can use httpmime.jar file instead of it, which will work better that NameValuePair. You can Download it from here, Download

MultipartEntity multi = new MultipartEntity();
multi.addPart("name", new StringBody("Raj"));
multi.addPart("Id", new StringBody("011"));

add this jar to your project and then use it.

Isuru
  • 30,617
  • 60
  • 187
  • 303
Dipankar Baghel
  • 1,932
  • 2
  • 12
  • 24
1

If you realy want to use NameValuePair in your application, you can add the useLibrary 'org.apache.http.legacy' to your gradle:

buildtypes{
    //------------
    //----------
}

useLibrary 'org.apache.http.legacy'
RoadieRich
  • 6,330
  • 3
  • 35
  • 52
Thilina H
  • 217
  • 1
  • 3
  • 19
-46

Yo can change your android Api in 21, right click, properties android, click in api 21 is work for me

  • 4
    Changing the compile version and the target is not a solution, just a workaround that will prevent you from using new APIs. – Ayoub Apr 30 '15 at 09:38
  • functions are depreciated as typically a newer, more improved alternative has been included. its counter productive and just incorrect to use this method. id recommend either Content Values as Menna-Allah Sami has provided, or Map – Simon. May 01 '15 at 14:52
  • NameValuePair is deprecated in API ver 22. It means It will not use in future. – AmmY Jul 09 '15 at 10:29