从android向PHP传递数组在android 4.1上失败,但在android 5+上成功


passing array to php from android fails on android 4.1 but succeeds on android 5+

注意:下面的代码完美地工作与我的galaxy s5与android 5.0,然而,它似乎总是无法保存时使用我的galaxy s3与android 4.1。我的应用程序的其他部分在两部手机上都运行良好。

这就是我如何填充JSArray,所有的数据都被检查过,并且都是有效的,没有空值。

 int i = 0;
                while (i<StudentIDzArray.length)
                {
                    //InsertMarks(getApplicationContext(), StudentIDzArray[i], SubjectID, SubjectName, StudentMarksArrayTemp[i], ClassID, ClassName, ExamNumber, StudentsArray[i]);
                    String SingleStudentInfo[] = {StudentIDzArray[i], SubjectID, SubjectName, StudentMarksArrayTemp[i], ClassID, ClassName, ExamNumber, StudentsArray[i]};
                    AllStudentInfo.add(SingleStudentInfo);
                    i++;
                }
                jsArray = new JSONArray(AllStudentInfo);

将json数组定义为全局变量

JSONArray jsArray;

使用Volley Library将数据保存到mysql数据库

 public void InsertMarks(final Context context)
    {
        RequestQueue queue = Volley.newRequestQueue(context);
        StringRequest sr = new StringRequest(Request.Method.POST,SaveUrl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response)
            {
                if(response.equals("success"))
                {
                    Toast.makeText(context,"Success added " ,Toast.LENGTH_LONG).show();
                }
                else
                {
                    Toast.makeText(context, "Failure to add"+  response,Toast.LENGTH_LONG).show();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(context,"connection error",Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String,String> getParams()
            {
                Map<String,String> params = new HashMap<String, String>();
                params.put("StudentsData",jsArray.toString());
                return params;
            }
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<String, String>();
                params.put("Content-Type","application/x-www-form-urlencoded");
                return params;
            }
        };
        queue.add(sr);
    }

,这是PHP代码读取数组和获取所有的值,以便能够保存到mysql。

$AllStudentsData =$_POST['StudentsData'];
$AllObj = json_decode($AllStudentsData);
// Create connection
$con=mysqli_connect("****","*****","********","*****") or die ( mysqli_error($MySQL_Handle) ); 
$sSQL= 'SET CHARACTER SET utf8'; 
mysqli_query($con,$sSQL) or die ('Can''t charset in DataBase'); 
mysql_query("SET NAMES utf8;");
mysql_query("SET CHARACTER_SET utf8;");
$ww = 0;
while ($ww < count($AllObj))
{
$StudentID = $AllObj[$ww][0];
$SubjectID = $AllObj[$ww][1];
$SubjectName = $AllObj[$ww][2];
$Mark = $AllObj[$ww][3];
$ClassNo = $AllObj[$ww][4];
$ClassName = $AllObj[$ww][5];
$Exam_ID = $AllObj[$ww][6];
$StudentFullName = $AllObj[$ww][7];
if($Exam_ID=="0")
{
$result1 = mysql_query("select * from  Student_Marks where Student_No='$StudentID' AND Subject_No='$SubjectID'");
if(mysql_num_rows($result1)>0)
{
$result = mysql_query("update Student_Marks SET 
S1_Mark_1A ='$Mark'
where Student_No='$StudentID' AND Subject_No='$SubjectID' AND ClassID='$ClassNo' ");
}
else
{
$result = mysql_query("INSERT INTO Student_Marks (Student_No,StudentFullName,Subject_No,Subject_Name,S1_Mark_1A,ClassID,ClassName) 
VALUES
('".$StudentID."','".$StudentFullName."','".$SubjectID."','".$SubjectName."','".$Mark."','".$ClassNo."','".$ClassName."')");
}
}

经过一些工作,试图找出什么出错了,在哪里,似乎数据成为垃圾时使用JSONArray。toString在android 4上是有效的,在android 5上也是有效的。

params.put("StudentsData",jsArray.toString());

在android 5和android 4上,这个代码在java上的编译是否不同?

似乎。tostring在android 5.0上得到了正确的结果…然而在android 4+上,它把数组弄乱了,不知道为什么。

我所做的就是下载gson库,将其导入到我的项目中,并使用以下代码

Gson gson = new Gson();
gson.tojson(myarray);

代替

myarray.toString();

则应用程序在android 4+支持的所有android版本上运行良好。