I'm currently developing an app that requires sending and receiving of data from android studio going to MySQL and then data coming from MySQL will be saved from the SQLite. I need advice on how to make the process faster. Right now I'm inserting 80,000 + rows of data coming from MySQL and then saving it to SQLite and that process lasts around 25-30 minutes. rowItem.php <?php require "init.php"; $serial = $_POST['mySerial']; $sql = "select ITEMCODE, DESCRIPTION, BRAND from items where SERIAL_NO = '" .$serial. "'"; $result = mysqli_query($con, $sql); $data =array(); while($row = mysqli_fetch_array($result)) { $row['ITEMCODE'] = mb_convert_encoding($row['ITEMCODE'], 'UTF-8', 'UTF-8'); $row['DESCRIPTION'] = mb_convert_encoding($row['DESCRIPTION'], 'UTF-8', 'UTF-8'); $row['BRAND'] = mb_convert_encoding($row['BRAND'], 'UTF-8', 'UTF-8'); array_push($data, array('ITEMCODE' => $row['ITEMCODE'], 'DESCRIPTION' => $row['DESCRIPTION'], 'BRAND' => $row['BRAND'])); } $json = json_encode(array("allItems"=>$data)); echo $json; ?> DatabaseOperations.java public class DatabaseOperations extends SQLiteOpenHelper { public static final int dbVersion = 1; public String CREATE_ITEMS_TABLE = "CREATE TABLE " + TableData.TableInfo.TB_ITEMS + " (" + TableData.TableInfo.COL_ITEMS_ITEMCODE + " VARCHAR(20) PRIMARY KEY NOT NULL, " + TableData.TableInfo.COL_ITEMS_DESCRIPTION + " VARCHAR(50), " + TableData.TableInfo.COL_ITEMS_BRAND + " VARCHAR(10), " + TableData.TableInfo.COL_ITEMS_BARCODE + " VARCHAR(20));"; public DatabaseOperations(Context context) { super(context, TableData.TableInfo.DB_NAME, null, dbVersion); } @Override public void onCreate(SQLiteDatabase sdb) { sdb.execSQL(CREATE_ITEMS_TABLE); } public void insertItems (DatabaseOperations dop, String itemCode, String brand, String desc) { SQLiteDatabase sq = dop.getWritableDatabase(); sq.beginTransaction(); try { ContentValues cv = new ContentValues(); cv.put(TableData.TableInfo.COL_ITEMS_ITEMCODE, itemCode); cv.put(TableData.TableInfo.COL_ITEMS_BRAND, brand); cv.put(TableData.TableInfo.COL_ITEMS_DESCRIPTION, desc); sq.insert(TableData.TableInfo.TB_ITEMS, null, cv); sq.setTransactionSuccessful(); } catch (Exception e) { } finally { sq.endTransaction(); sq.close(); } } } MainScreen.java public class MainScreen extends AppCompatActivity { Context ctx = this; Button btnSync; String rowItemURL = "http://192.168.100.118:81/rowItem.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_screen); btnSync = findViewById(R.id.btnSync); btnSync.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { StringRequest itemImeiRequest = new StringRequest(Request.Method.POST, rowItemURL, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject; jsonObject = new JSONObject(response); JSONArray itemArray = jsonObject.getJSONArray("allItems"); for (int i = 0; i < itemArray.length(); i++) { itemCode = itemArray.getJSONObject(i).getString("ITEMCODE"); itemBrand = itemArray.getJSONObject(i).getString("BRAND"); itemDesc = itemArray.getJSONObject(i).getString("DESCRIPTION"); DatabaseOperations dop = new DatabaseOperations(ctx); dop.insertItems(dop, itemCode, itemBrand, itemDesc); } Toast.makeText(ctx, "SYNC ITEMS COMPLETED!", Toast.LENGTH_LONG).show(); lblDebug.setText("SUCCESS!"); } catch (JSONException e) { Toast.makeText(ctx, e.getMessage(), Toast.LENGTH_LONG).show(); lblDebug.setText(e.getMessage() + "500"); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(ctx, error.getMessage(), Toast.LENGTH_LONG).show(); lblDebug.setText(error.getMessage() + "511"); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { SharedPreferences sharedPreferencesIMEI = getSharedPreferences(IMEI_PREF, MODE_PRIVATE); myIMEI = sharedPreferencesIMEI.getString(TEXT5, ""); Map<String,String> params = new HashMap<>(); params.put("mySerial", myIMEI); return params; } }; MySingleton.getInstance(MainScreen.this).addToRequestQue(itemImeiRequest); } } } } MySingleton.java public class MySingleton { private static MySingleton mInstance; private RequestQueue requestQueue; private static Context mCtx; private MySingleton(Context context) { mCtx = context; requestQueue = getRequestQueue(); } public RequestQueue getRequestQueue(){ if(requestQueue==null) { requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); } return requestQueue; } public static synchronized MySingleton getInstance(Context context) { if(mInstance==null) { mInstance = new MySingleton(context); } return mInstance; } public<T> void addToRequestQue(Request<T> request) { requestQueue.add(request); } }