

アンドロイドでsqliteのデータをPOST送信し、送信したデータを送信済み用のデータに格納しているのですが、受け取り側のPHPをいじっていてエラーが出ている場合でも、通信されたとみなされ、データが送信済み用のデータに格納されてしまいます。(その後にデータは消される)  
どのようにすればPHP側でエラーが出た場合にデータ格納の処理を中止できますか。  
教えてください。

[code]

    public class UploadAsyncTask
            extends AsyncTask<String, Integer, Integer> {
        private Activity MainActivity;
        public UploadAsyncTask(Activity activity) {
            MainActivity = activity;
        }
        @Override
        protected Integer doInBackground(String... params) {
    
            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(params[0]);
                List<NameValuePair> params2 = new ArrayList<NameValuePair>();
                helper = new DBOpenHelper(MainActivity.this);// DB作成
                // データの取得
                db = helper.getReadableDatabase();
                db4 = helper.getWritableDatabase();
                // 列名の定義
                String[] columns = {"productid", "name", "val1", "val2", "val3", "val4", "val5"}
                // データの取得
                Cursor cursor = db.query(DB_TABLE, null, null, null, null, null, "productid");
                int i = 0;
                String nippodata;
                db4.beginTransaction();
                while (cursor.moveToNext()) {
                    ContentValues val = new ContentValues();
                    val.put("productid",cursor.getString(0));
                    val.put("name",cursor.getString(1));
                    val.put("val1",cursor.getString(2));
                    val.put("val2",cursor.getString(3));
                    val.put("val3",cursor.getString(4));
                    val.put("val4",cursor.getString(5));
                    val.put("val5", cursor.getString(6));
                    // データ更新
                    db4.insert(DB_TABLE4,null, val);
                    data=cursor.getString(0)+"\t"+cursor.getString(1)+"\t"+cursor.getString(2)+"\t"+cursor.getString(3)+"\t"+cursor.getString(4)+"\t"+cursor.getString(5)+"\t"+cursor.getString(6);
                    params2.add(new BasicNameValuePair("product["+i+"]",data));
                    i++;
                }
                SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                String Key=sp.getString("SaveString", null);
                //事情所コード
                params2.add(new BasicNameValuePair("key",Key));
    
                db4.setTransactionSuccessful();
                // トランザクション制御終了
                db4.endTransaction();
    
                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(params2, "UTF-8"));
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    // ステータスコードを取得
                    int statusCode = httpResponse.getStatusLine().getStatusCode();
                    Log.e("statusCode", String.valueOf(statusCode));
                    // レスポンスを取得
                    HttpEntity entity = httpResponse.getEntity();
                    String response = EntityUtils.toString(entity);
                    entity.consumeContent();
                    // クライアントを終了させる
                    httpClient.getConnectionManager().shutdown();
                    db.beginTransaction();
                    db.execSQL("DELETE FROM " + DB_TABLE);
                    db.setTransactionSuccessful();
                    // トランザクション制御終了
                    db.endTransaction();
                } catch (UnsupportedEncodingException e1) {
    
                    e1.printStackTrace();
                }
    
            } catch (ClientProtocolException e) {
                e.printStackTrace();
    
            } catch (IOException e) {
    
                e.printStackTrace();
            }
            return 0;
        }
        @Override
        protected void onPostExecute(Integer result) {
            if (result==null) {
                Toast.makeText(NP_Submit.this, "エラー", Toast.LENGTH_SHORT).show();
                finish();
            }else{
                Toast.makeText(NP_Submit.this, "ok", Toast.LENGTH_SHORT).show();
            }
            progressDialog.dismiss();
        }
    
[/code]


CC BY-SA 3.0
2015-11-24T09:37:00.630
19240
2021-03-07T05:18:23.813
2021-03-07T05:18:23.813
3060
13247
question
java android
androidでPOST送信が失敗した場合にエラーを出したい


ソースコードを拝見すると、データベースへの登録直後に

[code]

    db4.setTransactionSuccessful();
    
    db4.endTransaction();
    
[/code]

と、すぐにトランザクションをコミットされていますので、

データベース登録→HTTP通信→データベース削除すべてが完了してからトランザクションをコミットするようにし、

例外を検出した場合はトランザクションをロールバックするようにすればよいかと思います。  
おそらくdb4のメソッドに、トランザクション失敗（？）を示すメソッドがあると思われますので、それを使って設定し、endTransaction()してみてください。

間違いがあったらご容赦ください。


CC BY-SA 3.0
2015-11-26T14:01:44.743
19338
2015-11-26T14:01:44.743
5778
19240
answer