Java 尝试访问SQLite表的活动中出现Null错误

Java 尝试访问SQLite表的活动中出现Null错误,java,android,sqlite,fragment,Java,Android,Sqlite,Fragment,新手问题再次出现; 因此,在FormActivity中,我post然后从远程服务器上的SQL表接收响应,数据被放入本地SQLite表行。然后,我有一个带有几个EditText字段的片段,我试图用本地表数据填充这些字段。现在,我在活动中有一个方法DrawText()来执行此操作,但是当运行时,我遇到了崩溃。我输入的logcat消息显示,当调用DrawText()时,它从SQLite表中提取的值为null 我移动了该方法,试图确保它在从服务器响应填充表之后访问表,但无法使其工作。任何帮助都将不胜感激

新手问题再次出现; 因此,在FormActivity中,我post然后从远程服务器上的SQL表接收响应,数据被放入本地SQLite表行。然后,我有一个带有几个EditText字段的片段,我试图用本地表数据填充这些字段。现在,我在活动中有一个方法DrawText()来执行此操作,但是当运行时,我遇到了崩溃。我输入的logcat消息显示,当调用DrawText()时,它从SQLite表中提取的值为null

我移动了该方法,试图确保它在从服务器响应填充表之后访问表,但无法使其工作。任何帮助都将不胜感激。下面的代码(现在使用帮助编辑)

FormActivity.java

public class FormActivity extends FragmentActivity {

    //create variables & Logcat tag
    private static final String TAG = FormActivity.class.getSimpleName();
    private EditText inputTitle;
    private EditText inputName;
    private EditText inputSurname;
    private SessionManager sm;
    private SQLiteHandler db;
    private ProgressDialog pDialog;
    private String e_check;
    private String surname;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        //set inputs for fields
        inputTitle = (EditText) findViewById(R.id.titleText);
        inputName = (EditText) findViewById(R.id.foreText);
        inputSurname = (EditText) findViewById(R.id.surnameText);

        //initialise pager for swipe screens
        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));

        // Progress dialog
        pDialog = new ProgressDialog(this);
        pDialog.setCancelable(false);

        //email value passed in
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            e_check = extras.getString("e_check");
        }

        // SQLite database handler - delete old and recreate db from remote server data
        db = new SQLiteHandler(getApplicationContext());

        String email = e_check;
        checkUserDetails(email);
        //<!-- TODO: load db fields to textfields -->
        //<!-- TODO: greeting toast -->
    }
    /**
     * function to verify & retrieve details in mysql db
     * */
    private void checkUserDetails(final String email) {
        // Tag used to cancel the request
        String tag_string_req = "req_retrieve";

        pDialog.setMessage("Retrieving details ...");
        showDialog();

        StringRequest strReq = new StringRequest(Request.Method.POST,
                AppConfig.URL_RETRIEVE, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Retrieval Response: " + response.toString());
                hideDialog();

                try {
                    JSONObject jObj = new JSONObject(response);
                    boolean error = jObj.getBoolean("error");

                    // Check for error node in json
                    if (!error) {
                        // user exists
                        // fill in textfields
                        String uid = jObj.getString("uid");

                        JSONObject user = jObj.getJSONObject("user");
                        String name = user.getString("name");
                        surname = user.getString("surname");
                        String email = user.getString("email");
                        String created_at = user
                                .getString("created_at");
                        String tel_no = user.getString("tel_no");
                        String home_add = user.getString("home_add");
                        String postcode = user.getString("postcode");
                        String postal = user.getString("postal");

                        // Inserting row in table
                        db.addUser(name, surname, email, uid, created_at, tel_no, home_add, postcode, postal);

                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //Do something after 300ms
                                DrawText();
                            }
                        }, 300);

                        /* Displaying the user details on the screen
                        FirstFragment fragA = (FirstFragment) getSupportFragmentManager().findFragmentByTag("fragA");
                        fragA.DrawText();*/

                    } else {
                        // Error in login. Get the error message
                        String errorMsg = jObj.getString("error_msg");
                        Toast.makeText(getApplicationContext(),
                                errorMsg, Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    // JSON error
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Retrieval Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_LONG).show();
                hideDialog();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                // Posting parameters to url
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "retrieve");
                params.put("email", email);

                return params;
            }
        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

    public void DrawText() {
        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();

        if (user.size() != 0) {
            //String surname = user.get("surname");
            Log.e(TAG, "string surname: " + surname);

            // Displaying the user details on the screen
            inputSurname.setText(surname);
        }else{
            Log.e(TAG, "something you want to say");
        }
    }

    private void showDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hideDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
                case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
                case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
                case 3: return FourthFragment.newInstance("FourthFragment, Instance 1");
                //case 4: return FifthFragment.newInstance("ThirdFragment, Instance 3");
                default: return FirstFragment.newInstance("FirstFragment, Default");

            }
        }

        @Override
        // Number of screens we want to swipe between
        public int getCount() {
            return 4;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_form, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

问题是您试图在添加数据之前收集数据。正如您所看到的,您正在调用
DrawText()在收到响应之后(将数据添加到数据库之前)。所以很明显数据是空的。您应该调用
DrawText()将数据添加到数据库后

db.addUser(name, surname, email, uid, created_at, tel_no, home_add, postcode, postal);
DrawText();
如果上述代码不起作用,请尝试在500毫秒后调用DrawText(),如下所示

db.addUser(name, surname, email, uid, created_at, tel_no, home_add, postcode, postal);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 500ms
    DrawText();
  }
}, 500);
private String surname;

.....{
    ....
    surname = jsonObject.getString("surname");
    ...
}

public void DrawText() {
        Log.e(TAG, "string surname: " + surname);

        // Displaying the user details on the screen
        inputSurname.setText(surname);
    }
如果上面什么都不起作用。声明字符串变量,如名称、姓氏等。。(您从JSON解析的)在方法之外,该方法将扩展任何方法中变量的可访问性并更新DrawText();像这样

db.addUser(name, surname, email, uid, created_at, tel_no, home_add, postcode, postal);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 500ms
    DrawText();
  }
}, 500);
private String surname;

.....{
    ....
    surname = jsonObject.getString("surname");
    ...
}

public void DrawText() {
        Log.e(TAG, "string surname: " + surname);

        // Displaying the user details on the screen
        inputSurname.setText(surname);
    }
public void DrawText(){
//从sqlite获取用户详细信息
HashMap user=db.getUserDetails();
如果(user.size()!=0){
字符串姓氏=user.get(“姓氏”);
Log.e(标签,“字符串姓氏:”+姓氏);
//在屏幕上显示用户详细信息
输入姓氏.setText(姓氏);
}否则{
Log.e(标记“你想说的话”);}
}

尝试在空对象引用上调用虚拟方法“void android.widget.EditText.setText(java.lang.CharSequence)”
它运行良好,但它将运行到其他方法。是否有办法强制它等到user.size()!=0或可能有类似睡眠(300)的等待时间,让响应时间完成?请尝试使用其他计时器…回忆DrawTextIt可能工作,但它不整洁。使用slop比使用crashing应用程序要好。好吧,使用你和SmulianJulian的答案,我现在让它运行起来没有错误,也没有从下面跳转到“else”。但是,它似乎没有运行到DrawText()中的Logcat标记注释那么远。抱歉,与您同时发布,现在将尝试此操作。如果您使用postDelay为300ms的处理程序,它将不会跳转到else。如果您对第二个解决方案不满意,请尝试我的第三个解决方案。:)不。我正在获取检索响应的logcat msge,但它似乎没有使用DrawText()-没有logcat msge表单,该方法在logcat中显示,EditText输出中没有更改。如果调用
DrawText()
,则应该在该方法中获取日志消息。