Introduce datos en la base de datos desde la aplicación de Android a través del servicio web.
Estoy trabajando en un código de Android que al hacer clic en un botón inserta datos en una base de datos remota a través de un servicio web. Mi código de servicio web es bastante simple. Sólo toma en un parámetro que es el valor de Android Spinner e inserta ese valor en la base de datos
He utilizado HttpClient para la publicación, pero no soy capaz de tener éxito en hacer mi tarea. ¿Puede alguien simplemente ayudarme con este problema?
- APP de Android que consume un servicio web cómo autenticar usuarios
- JDBC vs Servicio Web para Android
- Recibir y validar certificado del servidor HTTPS - android
- Asegurar la comunicación desde Android a un servicio web
- Android Obtener archivo pdf como resultado de httppost
Aquí está el código de servicio web:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Data.SqlClient; namespace putdata { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public String put(String value) { int count=1; int rows; SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"); try { myConnection.Open(); count++; SqlCommand myCommand = new SqlCommand(); myCommand.Connection = myConnection; myCommand.CommandText = "insert into record values('"+ count +"','" + value + "')"; myCommand.Parameters.Add("@value", SqlDbType.VarChar).Value = value; rows = myCommand.ExecuteNonQuery(); SqlDataReader myReader = myCommand.ExecuteReader(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { myConnection.Close(); } return "success"; } } }
Aquí está mi lógica principal para el código de Android:
public void onClick(View v) { String spinnerval1=""; String spinnerval2=""; // Perform action on clicks Toast.makeText(Mark.this, "calling web service", Toast.LENGTH_LONG).show(); if (v == findViewById(R.id.button)) { // prepare the dialog box Button progress = (Button) findViewById(R.id.button); progress.setOnClickListener((OnClickListener) Mark.this); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://10.0.2.2/enterdata/Service1.asmx"); try { String result; JSONObject obj = new JSONObject(); obj.put("Maths",spinnerval1); obj.put("Science",spinnerval2); ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("value1", spinnerval1)); nameValuePairs.add(new BasicNameValuePair("value2", spinnerval2)); httppost.setEntity((HttpEntity) new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse httpResponse = httpclient.execute(httppost); HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { InputStream is = httpEntity.getContent(); result = is.toString(); Log.i("Result is ", "Result: " + result); } } catch (ClientProtocolException e1) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } ProgressDialog dialog=new ProgressDialog(Mark.this); // make the progress bar cancelable dialog.setCancelable(true); // set a message text dialog.setMessage("Loading..."); dialog.show(); } }
Aquí está el logcat:
11-07 12:20:28.970: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example/.Mark } 11-07 12:20:29.361: DEBUG/AndroidRuntime(299): Shutting down VM 11-07 12:20:29.390: DEBUG/dalvikvm(299): Debugger has detached; object registry had 1 entries 11-07 12:20:29.460: INFO/AndroidRuntime(299): NOTE: attach of thread 'Binder Thread #3' failed 11-07 12:20:29.470: INFO/ActivityManager(58): Start proc com.example for activity com.example/.Mark: pid=306 uid=10060 gids={3003, 1015} 11-07 12:20:31.170: INFO/ActivityManager(58): Displayed activity com.example/.Mark: 1809 ms (total 1809 ms) 11-07 12:20:39.341: DEBUG/dalvikvm(127): GC_EXPLICIT freed 1321 objects / 73848 bytes in 161ms 11-07 12:20:40.981: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@45004b40 11-07 12:20:44.440: DEBUG/dalvikvm(201): GC_EXPLICIT freed 109 objects / 9024 bytes in 190ms 11-07 12:20:48.840: INFO/Result is(306): Result: org.apache.http.conn.EofSensorInputStream@44f4a4f8 11-07 12:20:50.490: DEBUG/dalvikvm(260): GC_EXPLICIT freed 759 objects / 54952 bytes in 1185ms
- ¿Hay alguna forma sólida de hacer frente a la autenticación integrada de Windows (NTLM) desde una aplicación de Android?
- Creación de un WebService ASP.net que devuelve JSON en lugar de XML
- Android, Ksoap, webService
- Envío de SQLite db al servicio web
- Comunicación bidireccional entre android y Server
- Android Fatal señal 11 (SIGSEGV) en 0x00000040 (código = 1) Error
- SoapFault - código de error: 'soap: Server' faultstring: 'System.Web.Services.Protocols.SoapException:
- Solicitudes seguras de servicio web
Ur falta estas líneas más probablemente: (agregue antes de httpclient.execute
)
httppost.setHeader("Accept", "application/json"); httppost.setHeader("Content-type", "application/json"); OR httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
Puede que tenga que establecer un tiempo de espera
No ha definido un tipo de contenido para la solicitud
Y yo usaría un manejador de respuestas para una programación más fácil con comando de ejecución
Para ayudar a aislar la causa del problema, haga que el servicio web devuelva "éxito" sin hacer nada más. De esta forma, puede comprobar que la comunicación httpclient con el servicio web funciona correctamente. A continuación, vuelva a agregar la lógica de la base de datos y continúe con la solución de problemas.
Parece que el problema es más probable con su servicio web o con el formato de la base de datos, ya que su código Android parece correcto. Si yo fuera tú, intentaría depurar el servicio web para localizar el problema.
- ¿Cómo usar el servicio Text-to-Speech de Google para los caracteres chinos en Android?
- OnStop llamado antes onStart