Android Studio:SQlite db ListView项目在startActivity上消失(Android Studio: SQlite db ListView items disappear on startActivity)
我是Android Studio和应用创建的新手。 我跟随Johhny Mansons Youtube quide寻找新的应用程序,并大大扩展了工作。
我的问题是,退出应用程序会在新登录时从列表视图中删除项目。
当我实现登录功能时,我将LoginActivity更改为主页面,按照startActivity到达MainActivity.java登录后应用程序功能齐全.A可以提交图片和文本,保存到SQLite并显示在ListView选项卡中。
但是,每当我退出或退回,然后再次登录。 数据被擦除。 我相信这是因为startActivity重新执行MainActivity,这可能是创建一个新数据库并删除旧数据库。 但我不确定原因及其发生的原因。 在实现LoginActivity之前,应用程序会保留数据。
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(); } });
MainActivity(功能处理问题)
populateList()应该让myListView显示问题。 值得注意的是,我正在使用两个数据库,一个用于用户,一个用于提问。
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 - DatabaseHandler - DatabaseHandlerUser - LoginActivity
- 主要活动
- 题
- RegisterActivity - 用户I am new to Android Studio and app creation. I followed Johhny Mansons Youtube quide for new apps, and extended the work greatly.
My problem is, logging out of the app removes items from the list view, upon a new login.
When I implemented login functionality, I changed LoginActivity to the main page, following a startActivity to reach MainActivity.java The app is fully functional once you log in. A can submit a picture and text, it is saved to SQLite and display in ListView tab.
However, whenever I log out, or tab back, and login again. The data is wiped. I believe it is because the startActivity executes MainActivity anew, which could be creating a new database and removing the old. But I am not quite sure of the cause and why it happens. Before implmeneting LoginActivity, the app would retain the data fine.
LoginActivity (Login page)
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(); } });
MainActivity (Function handling questions)
It is the populateList() that should get myListView to display Questions. It might also be worth noting that I am using two databases, one for users and one for 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; } }
Let me know if I should provide more information.
Class overview - CurrentUser - DatabaseHandler - DatabaseHandlerUser - LoginActivity
- MainActivity
- Question
- RegisterActivity - User
原文:https://stackoverflow.com/questions/29945756
最满意答案
创建一个表单 ,每个图像都有一个复选框。
使用图片ID作为复选框的ID。
如果表单已提交且有效,则会对图像进行迭代以了解其复选框是否已选中:
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; public function deleteImagesAction(Request $request){ // ... $images = // ... $formBuilder = $this->createFormBuilder(); foreach($images as $image){ $formBuilder->add($image->getId(),CheckboxType::class,array('label'=>$image->getName(),'required'=>false)); } $formBuilder->add('submit',SubmitType::class); $form = $formBuilder->getForm(); $form->handleRequest($request); if($form->isValid()){ $data = $form->getData(); $em = $this->getDoctrine()->getEntityManager(); foreach($images as $image){ if($data[$image->getId()]){ $em->remove($image); } } $em->flush(); return $this->redirectToRoute(...); } return $this->render(...); }
Create a Form, with a checkbox for each image.
Use the image id as id for the checkbox.
If the form is submitted and valid iterate over the images to know if their checkboxes were checked or not :
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; public function deleteImagesAction(Request $request){ // ... $images = // ... $formBuilder = $this->createFormBuilder(); foreach($images as $image){ $formBuilder->add($image->getId(),CheckboxType::class,array('label'=>$image->getName(),'required'=>false)); } $formBuilder->add('submit',SubmitType::class); $form = $formBuilder->getForm(); $form->handleRequest($request); if($form->isValid()){ $data = $form->getData(); $em = $this->getDoctrine()->getEntityManager(); foreach($images as $image){ if($data[$image->getId()]){ $em->remove($image); } } $em->flush(); return $this->redirectToRoute(...); } return $this->render(...); }
相关问答
更多-
jQuery Mobile框架弹窗中放表单文本框,整个弹窗区域都会变为文本框的触发焦点,不想这样[2022-03-02]
checkbox -
我想错误就在那里 access_control: - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin, roles: ROLE_ADMIN } 至于你告诉symfony的访问/admin/*路由,用户必须已经过身份验证。 此控制在/admin/login_check开始其操作之前完成。 您应该如下修改security.yml access_control: - { path ...
-
那么你需要重写你的删除逻辑到这样的东西 if (isset($_POST['delete']) && isset($_POST['checkbox'])) { foreach($_POST['checkbox'] as $del_id){ $del_id = (int)$del_id; $sql = "DELETE FROM forum_topics WHERE topic_id = $del_id"; mysql_query($sql); ...
-
Symfony 2.3使用复选框表单删除数据库中的行/条目(Symfony 2.3 using checkbox form to delete row/entry in database)[2023-01-02]
创建一个表单 ,每个图像都有一个复选框。 使用图片ID作为复选框的ID。 如果表单已提交且有效,则会对图像进行迭代以了解其复选框是否已选中: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; public function d ... -
通过传递动态参数(即id的占位符,在树枝中生成删除表单。 您可以在生成deleteForm控制器中执行此deleteForm 。 我们的想法是在action使用唯一标识符,以便我们可以通过jQuery替换。 return $this->createFormBuilder() ->setAction($this->generateUrl('image_delete', array('id' => 'image_id'))) ->setMethod('DELETE') ->getForm ...
-
当你调用$form->submit($data)或在你调用$form->handleRequest($request)情况下触发事件,如果请求是GET,它将调用(默认情况下) submit()方法或POST。 事件的顺序是: PRE_SET_DATA POST_SET_DATA PRE_SUBMIT 提交 POST_SUBMIT 如果查看Symfony\Component\Form\Form并检查submit()方法,您将看到触发事件的位置。 The events are triggered when yo ...
-
最好的方法是使用Javascript。 我建议你采取以下步骤: 1 /在Symfony表单中集成一个复选框。 2 /使用javascript隐藏复选框。 3 /上传图像时,显示图像(请参阅下面的代码摘录)+显示复选框 4 /检测事件(单击复选框),获取其值并根据其值隐藏或显示图像 可能有助于您显示图像的代码摘录: $(function() { $(".upload-file input").each(function(){ $(this).on("change", function(){ ...
-
Symfony动态地向表单引入条目导致TypeError(Symfony Dynamically Adding Entry to Form Leads to TypeError)[2022-09-26]
这是罪魁祸首 /** * @return mixed */ public function getIsCorrect() : bool { return $this->isCorrect; } 将其更改为 /** * @return mixed */ public function getIsCorrect() : bool { return boolval($this->isCorrect); } 编辑:好的,我会尝试提供更多信息。 你之所以遇到错误,是因为你的方法中的类型提示 ... -
对我来说,看起来像是一个明确的缓存问题,或者您可能缺少实体的使用声明。 代码对我来说是正确的。 to me that looks like either a clear cache issue or you may be missing a use statement for your entity. The code looks correct to me.
-
您应该使用Symfony \ Bridge \ Doctrine \ Form \ Type \ EntityType而不是CollectionType。 在您的UserType中 use Symfony\Bridge\Doctrine\Form\Type\EntityType; use AppBundle\Entity\Produit; public function buildForm(FormBuilderInterface $builder, array $options) { $bui ...