Android开发:JSON数据重复校验仅单条有效,多条失效求助
解决多数据下NIM与房间号的重复校验问题
我看了你的代码和返回的JSON数据,一下子就找到问题所在啦!你现在的校验逻辑失效,是因为在遍历JSON数组的时候,每次循环都把ruangan和nimMahasiswa这两个变量的值覆盖成当前元素的内容,最后这两个变量只会保存最后一条数据的信息。所以当数据库里有多条数据时,只有最后一条的NIM和房间号能被校验到,前面的都被覆盖掉了,自然就失效了。
解决方案思路
把单个的ruangan和nimMahasiswa变量换成集合(比如ArrayList<String>),用来存储所有已存在的NIM和房间号,这样在校验的时候就能检查输入值是否存在于整个集合中,而不是只和最后一条数据对比。
修改后的完整代码
import java.util.ArrayList; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class KelasActivity extends AppCompatActivity { EditText nim, ruang; String nim2, ruang2; // 把单个变量改成集合,存储所有已有的NIM和房间号 ArrayList<String> existingNims = new ArrayList<>(); ArrayList<String> existingRooms = new ArrayList<>(); ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_kelas); nim = (EditText) findViewById(R.id.editNim); ruang = (EditText) findViewById(R.id.ruangPinjam); new daftarMahasiswa().execute(); } public void nextButton(View view) { nim2 = nim.getText().toString().trim(); ruang2 = ruang.getText().toString().trim(); // 校验房间号是否已存在 if (existingRooms.contains(ruang2)) { Toast.makeText(KelasActivity.this, "This room has already been borrowed", Toast.LENGTH_LONG).show(); ruang.setError("You cannot borrow the room again"); } // 校验NIM是否已存在 else if (existingNims.contains(nim2)) { Toast.makeText(KelasActivity.this, "This NIM has already borrowed a room", Toast.LENGTH_LONG).show(); nim.setError("You cannot borrow again"); } else { // 这里写添加新数据的逻辑 Toast.makeText(KelasActivity.this, "Validation passed, can add data", Toast.LENGTH_SHORT).show(); } } class daftarMahasiswa extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(KelasActivity.this); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); // 每次加载数据前清空集合,避免重复数据 existingNims.clear(); existingRooms.clear(); } @Override protected String doInBackground(String... params) { String link_url = "http://192.168.43.54/datapeminjamankelas/read_mahasiswa.php"; JSONParser jParser = new JSONParser(); JSONObject json = null; try { json = jParser.AmbilJson(link_url); } catch (JSONException e) { e.printStackTrace(); } try { if (json != null) { JSONArray str_json = json.getJSONArray("data"); for (int i = 0; i < str_json.length(); i++) { JSONObject ar = str_json.getJSONObject(i); // 把每条数据的NIM和房间号添加到集合中 existingNims.add(ar.getString("nim").trim()); existingRooms.add(ar.getString("ruang").trim()); } } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { pDialog.dismiss(); } } }
关键修改点说明
- 集合替换单个变量:用
ArrayList<String>存储所有已存在的NIM和房间号,避免被循环覆盖。 - 循环添加数据到集合:在遍历JSON数组时,把每个元素的
nim和ruang添加到对应的集合中,而不是覆盖单个变量。 - 校验逻辑修改:使用集合的
contains()方法检查输入值是否存在于已有的数据中,这样就能覆盖所有数据的校验了。 - 清空集合:在
onPreExecute()里清空集合,避免每次重新加载数据时出现重复数据。
这样修改后,不管数据库里有多少条数据,都能准确校验NIM和房间号是否重复啦!
内容的提问来源于stack exchange,提问作者Mo Ne
相关产品推荐
相关产品推荐

