【问题标题】:How to save data from textview on sqlite database and JSON parse that data in android如何将来自 textview 的数据保存在 sqlite 数据库中并 JSON 在 android 中解析该数据
【发布时间】:2014-06-17 16:08:01
【问题描述】:

我从 SOAP Web 服务获取 SOAP WSDL 的 GetVehicles 方法,并在单击 Button 事件时调用 GetVehicles 导致 TextView。 我的 xml 中有一个按钮和一个 TextView。

当我运行程序时,数据显示在 textview 中,我想在 Sqlite 数据库中存储或保存 TextView 中显示的结果? 我创建了扩展 SQLiteOpenHelper 的 DatabaseHandler 类。 我正在传递这两个用于 id 和 name 的参数,

这是我的代码:

public class GetVehiclesActivity extends Activity {

    private static String SOAP_ACTION = "http://tempuri.org/GetServerVehicles";

    private static String NAMESPACE = "http://tempuri.org/";
    private static String METHOD_NAME = "GetServerVehicles";

    private static String URL = "http://favouritehatfield.co.uk/Service1.asmx?";        
    private TextView txtV_vehicles;

    private long clientid=46;

    private String response;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.getvehicles);

        /** Show Toast at the Start of Activity... **/
        Toast.makeText(this, "WELCOME to GET VEHICLES ACTIVITY..", 1).show();

        txtV_vehicles = (TextView) findViewById(R.id.txtV_lbl_vehicles);

         DatabaseHandler db = new  DatabaseHandler(this);

    }//End onCreate()

    private class vehiclesAsyncTask extends AsyncTask<Void, Void, Void>{


        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

            txtV_vehicles.setText(response);

        }//End onPostExecute()

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();

        }//End onPreExecute()

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

       SoapObject getVehiclesRequest = new SoapObject(NAMESPACE,METHOD_NAME);
            // add paramaters and values

            PropertyInfo pi = new PropertyInfo();
            pi.setName("defaultclientId");
            pi.type= PropertyInfo.LONG_CLASS;
            getVehiclesRequest.addProperty(pi,46);

            PropertyInfo pi2 = new PropertyInfo();
            pi2.setName("hashKey");
            pi2.type= PropertyInfo.STRING_CLASS;
            getVehiclesRequest.addProperty(pi2,"464321orue");

       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 

            envelope.setOutputSoapObject(getVehiclesRequest);  
            envelope.dotNet = true;
            HttpTransportSE httpTransport = new HttpTransportSE(URL);

            //httpTransport.debug = true;  

            try {
                httpTransport.call(SOAP_ACTION, envelope);
            } catch (HttpResponseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
            SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
                response = result.toString();
            } catch (SoapFault e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  


            return null;
        }//End doInBackground

    }// End vehiclesAsyncTask


    /** Called when the user clicks the GetVehicles button */
    public void getVehicle(View v) {
         String str = "You have clicked GetVehicles ...";
            Toast.makeText(this, str, 0).show();

        vehiclesAsyncTask vehiclesRequest = new vehiclesAsyncTask();
        vehiclesRequest.execute();
       //       
    }//End getVehicle()

    /** Called when the user clicks the SAVEDATA button  I want this buton to save the  TextView result in SQLite Database*/

    /** Called when the user clicks the SAVEDATA button */
public void saveData(View v) {

     String str = "Save DAta Button Clicked ...";
     Toast.makeText(this, str, 0).show();

    String s1 = txtV_vehicles.getText().toString();

    Objdbhandler.saveVehicles(s1, s1, s1, s1, s1);

//  Objdbhandler.saveVehicles(Name, TotalPassengers, TotalHandLuggages, TotalLugages, SortOderNo)

}//End saveData(...) Method

}//结束类GetVehiclesActivity

我搜索了很多,但找不到任何线索。 我怎样才能做到这一点?

【问题讨论】:

  • 我传递了这两个参数,分别是 id 和 name,PropertyInfo pi = new PropertyInfo(); pi.setName("defaultclientId"); // pi.setValue(clientid); pi.type=PropertyInfo.LONG_CLASS; getVehiclesRequest.addProperty(pi,46); PropertyInfo pi2 = new PropertyInfo(); pi2.setName("hashKey"); // pi.setValue(clientid); pi2.type=PropertyInfo.STRING_CLASS; getVehiclesRequest.addProperty(pi2,"464321orue");
  • 您是否尝试插入 2 个不同的数据库,因为我可以在 db.insert() 命令中看到“defaultclientId”和“mensagens”?
  • 日志猫有异常吗?
  • no defaultclientid 和 hashcode 是我的两个参数。 menagens 被评论不应该被阅读。此数据来自 SOAP Web 服务

标签: android web-services soap android-sqlite arrays


【解决方案1】:

我假设 DatabaseHandler() 工作正常。根据代码示例,我可以看到您编写的问题

cValues.put("defaultclientId", "clientidclientid");
db.insert("defaultclientId", null, cValues);

在这里,您在插入查询中传递与 columnName 相同的 databaseName。插入查询的正确用法如下:

public long insert (String table, String nullColumnHack, ContentValues values)

在哪里

table:=the table to insert the row into
nullColumnHack:=optional; may be null. 
values:=this map contains the initial column values for the row. The keys should be the column names and the values the column values

所以,你应该使用下面的代码插入数据库:

ContentValues values = new ContentValues(); 
values.put("defaultclientId", "put_default_client_id_received_from_SOAP"); 
values.put("hashkey", "put_hashkey_received");
database.insert("database_name", null, values);

希望这能解决问题!

【讨论】:

  • 我通过将 TextView 对象 txtV_vehicles 分配给字符串 s1 找到了 75% 的灵魂: /** 当用户单击 SAVEDATA 按钮时调用 */ public void saveData(View v) { String str = "单击保存数据按钮..."; Toast.makeText(this, str, 0).show();字符串 s1 = txtV_vehicles.getText().toString(); Objdbhandler.saveVehicles(s1, s1, s1, s1, s1); }//结束 saveData(...) 方法但它没有给我 TE ACTUAL DATA 要存储在 REQUIRED COLUMN 中。我在 DATABASEHANDLER 类中的 SAVEVEHICLE 插入方法具有以下参数:
  • saveVehicles(Name, TotalPassengers, TotalHandLuggages, TotalLugages, SortOderNo)
  • public boolean saveVehicles(String Name, String TotalPassengers, String TotalHandLuggages,String TotalLugages, String SortOderNo) { objSQLitedb = this.getWritableDatabase();内容值初始值 = 新内容值(); initialValues.put(VEHICLE_COLUMN_NAME, 名称); // 这里我放了所有(键,值); initialValues.put(VEHICLE_COLUMN_ZSORTORDERNO, SortOderNo); objSQLitedb.insert(VEHICLE_TABLE_NAME, null, initialValues); objSQLitedb.close();返回真; }//方法saveVehicles(...)结束
  • insertVehicle 方法的这些数据显示在所有列中,但整个波纹管数据同时显示在 TABLE 的所有列中这件事出现在所有列中 [{"Id":35,"Name": "Saloon","TotalPassengers":4,"TotalHandLuggages":2,"TotalLuggages":2,"SortOrderNo:0"}] ,我知道是因为 Objdbhandler.saveVehicles(s1,s1,s1,s1,s1);我希望 Id 存储在 Id 列中,Name 存储到 Name 列中,我应该在 JSon Parsing 中进行还是以任何其他方式进行,请指导我。
  • 是的,当您使用 saveData 功能时,您可以按照以下步骤操作: 1. 使用 android 中可用的 Json api 解析数据。编写将返回解析数据的函数。您还可以创建 POJO 类来保存 Json 响应中的不同字段并从 parse 方法返回它。或者只是将其存储为带有键和值的 hashmap。 2. 然后将此数据传递给 saveVehicles(PARSED_DATA) 方法。 3. 现在在 saveVehicle 方法中,您可以将数据放入 ContentValues 并插入到数据库中。
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多