2017-07-25 69 views
1

我试过了所有想到的,我已经研究了2天了。我是Android新手。我最后的求救声援我转向了Stackoverflow的主人。引导我。EditText SetText获取空值。从sql中检索值通过php

Background.java

protected String doInBackground(String... params) {  
     String update_id = params[1]; 
     try { 
      URL url = new URL(update_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
      httpURLConnection.setRequestMethod("POST"); 
      httpURLConnection.setDoOutput(true); 
      OutputStream OS = httpURLConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8")); 
      String data = URLEncoder.encode("id","UTF-8") + "=" + URLEncoder.encode(update_id, "UTF-8"); 
      OS.write(data.getBytes()); 
      bufferedWriter.flush(); 
      OS.close(); 
      InputStream is = httpURLConnection.getInputStream(); 
      is.close(); 


      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); 
      String inputLine; 
      while((inputLine = bufferedReader.readLine()) != null){ 
       sb.append(inputLine); 
      } 

      return "update";} 
     @Override 
      protected void onPostExecute(String result) { 
      AccountDetailsFragment ac = new AccountDetailsFragment(); 
      ac.receiveDetails(sb);} 

AccountDetailsFragment.java

public class AccountDetailsFragment extends Fragment{ 

EditText update_id, update_address, update_name; 
String id = ""; 
String idd ,namee ,addresss, login_id; 
View v; 
public AccountDetailsFragment() { 
    // Required empty public constructor 
} 

public void receiveLoginID(String id){ 
    this.login_id = id; 
} 

public void receiveDetails(StringBuilder sb){ 
    String[] strArray = sb.toString().split(Pattern.quote("split")); 
    idd= strArray[0]; 
    namee= strArray[1]; 
    addresss= strArray[2]; 

    System.out.println("-*-*--*-*-*-*-*-*-*-*"); 
    System.out.println(idd); 
    System.out.println(namee); 
    System.out.println(addresss); 
    System.out.println("*-*-*-*-*-*-*-*-*-*-*"); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    LayoutInflater lf = getActivity().getLayoutInflater(); 
    v = lf.inflate(R.layout.fragment_account_details, container, false); 

    update_id = (EditText) v.findViewById(R.id.et_id_edit); 
    update_name = (EditText) v.findViewById(R.id.et_Name_edit); 
    update_address = (EditText) v.findViewById(R.id.et_address_edit); 

    getActivity().setTitle("Account Details"); 

    Button update = (Button) v.findViewById(R.id.btnUpdate); 
    update.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String method = "update"; 
      Background background = new Background(getContext()); 
      background.execute(method, login_id); 

      System.out.println("*/*/*/*/*/*/*/*/*/*/*/"); 
      System.out.println(idd); 
      System.out.println(namee); 
      System.out.println(addresss); 
      System.out.println("*/*/*/*/*/*/*/*/*/*/*/"); 

      update_id.setText(idd.toString()); 
      update_name.setText(namee.toString()); 
      update_address.setText(addresss.toString()); 

     } 
    }); 

    return v; 
}} 

Update.php

<?php 

    require "init.php"; 
    $update_id=$_POST["id"]; 

    $sql_query="select * from test where id = '$update_id'"; 

    $result = mysqli_query($con,$sql_query); 

    if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     echo $row["id"]; 
     echo ("split"); 
     echo $row["name"]; 
     echo ("split"); 
     echo $row["address"]; 
    } 
    } else { 
     echo $update_id; 
    } 
    ?> 

logcat的

I/System.out: */*/*/*/*/*/*/*/*/*/*/ 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: null 
07-25 15:55:09.367 5914-5914/com.syntillate.aazif.aazifapp I/System.out: 
*/*/*/*/*/*/*/*/*/*/*/ 

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference 
                       at com.syntillate.aazif.aazifapp.AccountDetailsFragment$1.onClick(AccountDetailsFragment.java:115) 
+0

我认为你得到空值 – Anil

+0

你尝试从浏览器调用PHP脚本?你有预期的产量吗? – MilanG

+0

System.out.println(idd); System.out.println(namee); System.out.println(addresss);这一行的输出是什么?我认为你得到了空值并尝试idd.toString())。而不是toString()使用String.valueof(idd); –

回答

0

更改onPostExecute()这个

@Override protected void onPostExecute(String result) { receiveDetails(sb); }

,也使Background一个内部类,如果它是不是已经。

你正在做的:

AccountDetailsFragment ac = new AccountDetailsFragment(); ac.receiveDetails(sb);

创造AccountDetailsFragment一个新的实例并调用receiveDetails() 它不调用类更改值(IDD,namee &编辑部地址)。

+0

这不是一个内部类。这是一个独立的课程。帮助我理解为什么我应该让背景成为内心阶层。会有什么区别。 – MA3STRO

+0

如果它是一个内部类,那么它可以直接访问外部类的'receiveDetails'。如果你不想让内部类使'receiveDetails'成为静态的并且像'AccountDetailsFragment'那样调用它。receiveDetails(sb)' – Adithya

+0

如果我使接收细节为静态,那么我将无法访问全局变量,主要是视图。但是我可以尝试在接收细节类中再次设置视图并检查它是否有效。 另外我发现从数据库中获取数据时出错。它返回null。 – MA3STRO

0

你的doInBaground()函数返回String值“update”。这将来onPostExecute(字符串结果)方法,你会得到结果作为“更新”。 receiveDetails(StringBuilder sb)的AccountDetailsFragment类,因为你正在使用下面的条件分割字符串。

String [] strArray = sb.toString()。split(Pattern.quote(“split”));

strArray数组越来越null,因为split函数不会返回任何与onPostExecute()相关的结果。

+0

它不应该为空,因为sb是一个全局变量,一旦通过php获取数据,它将被保存在sb中。然后,我只是将该sb传递给AccountDetailsFragment类中的receiveDetails方法。问题是从sql数据库中获取数据。没有任何内容被提取 – MA3STRO

+0

在这种情况下,在sb正在追加的while()中放置一个日志。要交叉检查它,请在onPostExecute()和receiveDetails()方法中插入一个日志。如果它打印为空,则可能是后端脚本的问题。 –

+0

它正在打印空值。后端脚本如? – MA3STRO