安卓工作室:SQlite数据库ListView项目在startActivity上消失



我是安卓工作室和应用程序创建的新手。我跟随Johny Mansons Youtube开发新的应用程序,并极大地扩展了这项工作。

我的问题是,从应用程序注销会在新登录时从列表视图中删除项目。

当我实现登录功能时,我将LoginActivity更改为主页,然后启动Activity以访问MainActivity.java。登录后,该应用程序将完全正常工作。a可以提交图片和文本,它将保存到SQLite并显示在ListView选项卡中。

然而,每当我注销,或返回选项卡,然后再次登录时。数据被擦除。我相信这是因为startActivity重新执行MainActivity,这可能是创建一个新数据库并删除旧数据库。但我不太确定原因和为什么会发生这种情况。在实施LoginActivity之前,该应用程序会很好地保留数据。

登录活动(登录页面)

mLogin = (Button) findViewById(R.id.oButton);
mLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user = new User(dbHandlerUsers.getUserCount(), String.valueOf(mUsername.getText()), String.valueOf(mPassword.getText()), null);
if (validUser(user)) {
CurrentUser g = CurrentUser.getInstance();
g.setCurrentUser(String.valueOf(mUsername.getText()));
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
return;
}
Toast.makeText(getApplicationContext(), "Wrong username or password", Toast.LENGTH_SHORT).show();
}
});

主要活动(功能处理问题)

populateList()应该让myListView显示Questions。可能还值得注意的是,我使用了两个数据库,一个用于用户,另一个用于问题。

public class MainActivity extends ActionBarActivity {
private static final int EDIT = 0, DELETE = 1;
EditText questionTxt; //include picture too
ImageView questionImageImgView;
List<Question> Questions = new ArrayList<Question>();
List<Question> OtherQuestions = new ArrayList<Question>(); //Preparing for incoming data
ListView myListView;
ListView otherListView;
Uri imageUri = Uri.parse("android.resource://kaist624.projekt.kse624_projekt1"+R.drawable.no_user_logo);
DatabaseHandler dbHandler;
double myLongitude = 0.0d, myLatitude = 0.0d; //Later remove 0.0d
double qLongitude = 0.0d, qLatitude = 0.0d;
int longClickedItemIndex;
ArrayAdapter<Question> questionAdapter;
private float currentValue;
private long lastUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHandler = new DatabaseHandler(getApplicationContext());
questionTxt = (EditText) findViewById(R.id.txtQuestion);
myListView = (ListView) findViewById(R.id.listView);
otherListView = (ListView) findViewById(R.id.listView2);
questionImageImgView = (ImageView) findViewById(R.id.imgQuestion);
//This make our items in listView clickable on an event.
registerForContextMenu(myListView);
myListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
longClickedItemIndex = position; //Position tell where the item was clicked
return false;
}
});
TabHost tabHost = (TabHost) findViewById(R.id.tabHost);
tabHost.setup();
...

final Button addBtn = (Button) findViewById(R.id.btnAdd);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Find the currently logged in user
CurrentUser user = CurrentUser.getInstance();
String currentUser=user.getCurrentUser();
//Add question
Question question = new Question(dbHandler.getQuestionsCount(), String.valueOf(questionTxt.getText()), qLongitude, qLatitude, imageUri, currentUser);
dbHandler.createQuestion(question);
Questions.add(question);
questionAdapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), String.valueOf(questionTxt.getText()) + " has been added", Toast.LENGTH_SHORT).show();
clearFields();
}
});
questionTxt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
addBtn.setEnabled(String.valueOf(questionTxt.getText()).trim().length() > 0);
}
@Override
public void afterTextChanged(Editable s) {
}
});


//Populate list view with questions
if (dbHandler.getQuestionsCount() !=0)  //If there are contacts
Questions.addAll(dbHandler.getAllQuestions()); //Add content
populateList();
}
...
dHandler.deleteQuestion(Questions.get(longClickedItemIndex));
Questions.remove(longClickedItemIndex);
questionAdapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
public void onActivityResult(int reqCode, int resCode, Intent data) {
if (resCode == RESULT_OK) {
if (reqCode == 1) {
imageUri = data.getData();
questionImageImgView.setImageURI(data.getData());
}
}
}
private void populateList() {
questionAdapter = new QuestionListAdapter();
myListView.setAdapter(questionAdapter);
//Add method to search for other phone's adapter list
otherListView.setAdapter(questionAdapter);
}
private class QuestionListAdapter extends ArrayAdapter<Question> { //THIS CREATES A GROUP OF QUESTION, DISTANCE AND IMAGE - AS ONE OBJECT
public QuestionListAdapter() {
super (MainActivity.this, R.layout.listview_item, Questions);
}
@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null)
view = getLayoutInflater().inflate(R.layout.listview_item, parent, false);
Question currentQuestion = Questions.get(position);
TextView question = (TextView) view.findViewById(R.id.qQuestion);
question.setText(currentQuestion.getQuestion());
TextView username = (TextView) view.findViewById(R.id.qLongitude);
username.setText(currentQuestion.getUser());
//TextView longitude = (TextView) view.findViewById(R.id.qLongitude);
//longitude.setText(currentQuestion.getUser());
TextView latitude = (TextView) view.findViewById(R.id.qLatitude);
latitude.setText(Double.toString(currentQuestion.getLatitude()) + " meters");
ImageView  questionImage = (ImageView) view.findViewById(R.id.qImageView);
questionImage.setImageURI(currentQuestion.getImageURI());
//TextView distance = (TextView) view.findViewById(R.id.qDistance);
//distance.setText(Double.toString(currentQuestion.getDistance()));
return view;
}
}

如果我应该提供更多信息,请告诉我。

类概述-CurrentUser-数据库处理程序-数据库处理程序用户-登录活动
-主活动
-问题
-RegisterActivity-用户

查看代码很难找到问题所在。我能搞清楚的是:

  1. 尝试检查您是否正确创建了数据库
  2. 如果您的数据库是正确的,那么如果您正在从列表视图对象中的数据库中获取数据,请尝试调试
  3. 如果你正在获取数据,那么可能是你没有在列表视图中正确设置数据

研究"活动"的生命周期,可以帮助您了解视图在什么情况下的行为。

如果您在调试代码时遇到任何问题,请告诉我。

最新更新