본문 바로가기
Android

[Android] 안드로이드 DB 접근 / JSON 방식으로 서버 통신하기

by 준토리73 2023. 1. 10.

안드로이드에서는 보안상의 이유로 직접 DB에 접근할 수 없다.

그래서 서버에 있는 데이터를 json방식으로 안드로이드 내장 DB인 SQLite에 가져와서 처리 후,

처리한 데이터를 다시 JSON형태로 서버에 보내는 기능을 구현하였다. 

 

💡 서버에서 JSON형태로 데이터 받아오기 

 @Override
public void onOrderDown() {
    JSONObject params = new JSONObject();

    String sql = "Delete From TB_ORDER_INFO";
    db.execSQL(sql);

    try {
        params.put("data", "");
        params.put("query", "select order_no, receiver_nm, tracking_no, prdt_nm, prdt_order_cnt, prdt_barcode from tb_order_info");

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                String resultMsg = RemoteUtil.call("/get_pda_OrderList?JsonParam=", params, "GET");

                if (resultMsg == null) {
                    ((fragment_masterReg) fragment).frag_showToast("서버실행 확인 또는 WIFI 연결을 확인 후 수신 하세요!");
                    return;
                }
                JSONObject jsonObject = null;
                try {
                    resultMsg = JBUtil.jsonReplace(resultMsg);
                    jsonObject = new JSONObject(resultMsg);

                    String succ = jsonObject.getString("succ");
                    String data = jsonObject.getString("data");
                    data = JBUtil.unCompress(data);

                    if (succ.equals("true")) {
                        JSONArray arr = null;
                        arr = new JSONArray(data);

                        try {
                            String sql = "";
                            progressOrder  = (ProgressBar) findViewById(R.id.progressBarOrder);
                            progressOrder.setProgress(0);

                            int j = 0;
                            progressOrder.setMax(arr.length());
                            for (int i = 0; i < arr.length(); i++) {
                                sql = "insert into TB_ORDER_INFO VALUES( " + arr.getJSONObject(i).getString("order_no") + ",'"
                                        + arr.getJSONObject(i).getString("receiver_nm") + "','"
                                        + arr.getJSONObject(i).getString("tracking_no") + "','"
                                        + arr.getJSONObject(i).getString("prdt_nm") + "','"
                                        + arr.getJSONObject(i).getString("prdt_order_cnt") + "','"
                                        + arr.getJSONObject(i).getString("prdt_barcode") + "')";
                                db.execSQL(sql);
                                progressOrder.incrementProgressBy(1);
                            }
                            ((fragment_masterReg) fragment).frag_showToast("주문정보 마스터 수신완료.");
                        } catch (SQLiteException sqex) {
                            ((fragment_masterReg) fragment).frag_showToast("주문정보 마스터 처리중 오류 발생.");
                            Log.e(TAG, sqex.toString());
                        }
                    }else{
                        ((fragment_masterReg) fragment).frag_showToast("주문정보 마스터 수신중 오류 발생.");
                        Log.e(TAG, "주문정보 마스터 수신 오류");
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    } catch (Exception e){
        Log.e(TAG, e.getLocalizedMessage(), e);
    }
}

💡 서버로 JSON형태로 데이터 전송하기 

@Override
public void onDataSend() {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {

            String selectSql = "SELECT tracking_no, prdt_barcode, prdt_chk_cnt, reg_nm, reg_dt  FROM tb_pda_order_data" ;

            Cursor cursor = db.rawQuery(selectSql, null);

            if (cursor.getCount() > 0) {
                ((fragment_orderList) fragment).frag_showToast("전송시작 !!\n전송 완료된 데이터는 PDA에서 삭제됩니다.");

                try{
                    cursor.moveToFirst();
                    for (int i = 0 ; i < cursor.getCount(); i++) {
                        try {
                            JSONObject params = new JSONObject();

                            params.put("tracking_no", cursor.getString(0) );
                            params.put("prdt_barcode", cursor.getString(1) );
                            params.put("prdt_chk_cnt", cursor.getInt(2) );
                            params.put("reg_nm", cursor.getString(3) );
                            params.put("reg_dt", cursor.getString(4) );

                            String resultMsg = RemoteUtil.call("/update_pda_StockOut?JsonParam=", params, "GET");

                            if (resultMsg == null) {
                                ((fragment_orderList) fragment).frag_showToast("서버실행 확인 또는 WIFI 연결을 확인 후 수신 하세요!");
                                return;
                            }
                            JSONObject jsonObject = null;

                            resultMsg = JBUtil.jsonReplace(resultMsg);

                            jsonObject = new JSONObject(resultMsg);

                            String succ = jsonObject.getString("succ");
                            if (succ.equals("true")) {
                                if ((i + 1) % 10 == 0 || cursor.getCount() == i + 1)
                                    ((fragment_orderList) fragment).frag_showToast(String.valueOf(i + 1) + " / " + String.valueOf(cursor.getCount()) + " 전송");
                                String delectSql = "Delete From tb_pda_order_data where tracking_no = '" + cursor.getString(0) +"' and  prdt_barcode = '" + cursor.getString(1)+"'" ;
                                db.execSQL(delectSql);
                            }else {
                                ((fragment_orderList) fragment).frag_showToast(jsonObject.getString("errMsg")+ "\n해당 데이터를 삭제 후 재 등록하시기 바랍니다.");
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                return;
                            }
                        } catch (JSONException e) {
                            ((fragment_orderList) fragment).frag_showToast("주문정보 데이터 전송 중 오류 발생.");
                            Log.e(TAG, e.getLocalizedMessage(), e);
                            return;
                        }
                        cursor.moveToNext();
                    }

                    ((fragment_orderList) fragment).frag_showToast("주문정보 데이터가 정상 전송 되었습니다.");


                } catch (SQLiteException sqex) {
                    ((fragment_orderList) fragment).frag_showToast("주문정보 데이터 전송 후 데이터 삭제 중 오류 발생.");
                    Log.e(TAG, sqex.getLocalizedMessage(), sqex);
                }
            }else{
                ((fragment_orderList) fragment).frag_showToast("전송할 데이터가 없습니다.");
                return;
            }
            cursor.close();
        }
    });
    thread.start();

    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

댓글