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