SQLite / Next,Previous / Probleme mit Position

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SQLite / Next,Previous / Probleme mit Position

    Guten Morgen
    habe wieder einmal ein Problem. Dieses mal mit der SQL Datenbank.
    Muss zugeben das ich da sehr wenig Erfahrung damit habe.
    Ich habe mir eine Test Datenbank aufgebaut mit / Add, Delete, Update , Show. Das hab ich mir mehr oder weniger aus Youtube zusammengebastelt.
    Funktioniert aber recht gut und hab ich eigentlich auch hoffentlich verstanden.
    Nun bin ich dabei mir einen Forward und Backward Knopf mit einzubauen. Also immer 1 hoch oder 1 runter zählen und Anzeigen.
    Die Forward Taste funktioniert super (position wird immer hochgezählt) aber wenn ich den Backward Knopf drücke fängt er bei 0 an anstatt bei der letzten Forward Position z.B. 4.
    Ich könnte natürlich die position Variable so definieren dass sie "global" gilt, das will ich aber erst mal nicht.
    Möchte verstehen warum es nicht geht.
    Ich dachte dass beim Hochzählen die Position in der Datenbank hochgezählt wird (cursor.moveToPosition) und nicht nur die Variable.

    Hier mal der Code von DataBaseHelper.java

    Quellcode

    1. .....
    2. public Cursor forwardData () {
    3. //
    4. SQLiteDatabase db = this.getWritableDatabase();
    5. Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    6. return data;
    7. }
    8. public Cursor backwardData () {
    9. //
    10. SQLiteDatabase db = this.getWritableDatabase();
    11. Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    12. return data;
    13. }
    Alles anzeigen

    und hier der von der MainActivity

    Brainfuck-Quellcode

    1. ...........
    2. public void ForwardData() {
    3. btnForward.setOnClickListener(new View.OnClickListener() {
    4. int position = etID.getText().toString().length();
    5. @Override
    6. public void onClick(View v) {
    7. Cursor cursor = butterflyDB.forwardData();
    8. // int position = etID.getText().toString().length();
    9. position++;
    10. if (position < cursor.getCount()) {
    11. cursor.moveToPosition(position);
    12. // Toast.makeText(MainActivity.this, "Position " + position, Toast.LENGTH_LONG).show();
    13. //Toast.makeText(MainActivity.this, "Cursor Count " + cursor.getCount(), Toast.LENGTH_LONG).show();
    14. etName1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    15. etName2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    16. etID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    17. }
    18. }
    19. });
    20. }
    21. public void BackwardData(){
    22. btnBackward.setOnClickListener(new View.OnClickListener() {
    23. int position = etID.getText().toString().length();
    24. @Override
    25. public void onClick(View v) {
    26. Cursor data = butterflyDB.backwardData();
    27. //Toast.makeText(MainActivity.this, "Position " + position, Toast.LENGTH_LONG).show();
    28. // int position = etID.getText().toString().length();
    29. position--;
    30. Toast.makeText(MainActivity.this, "Position " + position, Toast.LENGTH_LONG).show();
    31. if (position>0){
    32. data.moveToPosition(position);
    33. Toast.makeText(MainActivity.this, "Position " + position, Toast.LENGTH_LONG).show();
    34. // Toast.makeText(MainActivity.this, "Cursor Count " + cursor.getCount(), Toast.LENGTH_LONG).show();
    35. etID.setText(data.getString(0), TextView.BufferType.EDITABLE);
    36. etName1.setText(data.getString(1), TextView.BufferType.EDITABLE);
    37. etName2.setText(data.getString(2), TextView.BufferType.EDITABLE);
    38. }
    39. }
    40. });
    41. }
    Alles anzeigen
    Danke schon mal für eure Unterstützung
  • Guten Tag herm_no,

    ich hab das noch nie gesehen das man im setOnClickListener also gleich unterhalb eine Variable deklariert.
    Probier doch mal die Variable hier drunter zu deklarieren.

    Java-Quellcode

    1. @Override
    2. public void onClick(View v) {
    3. int position = etID.getText().toString().length();
    4. }
    Also so mach ich das immer und so bekommt auch die Variable immer den neuesten Wert. Ich glaube bei deinem Code holt er sich einmal die Position und dann nie wieder.
    Wenn ich falsch liege bitte sagt es mir :D
  • Danke für deine Antwort.
    Das hatte ich vorher schon so , diese Zeile war nur ein Test. Ist nun wieder so wie du geschrieben hast.
    Allerdings geht es immer noch nicht.
    Jetzt ist mir allerdings aufgefallen, das bei Forward auch die Position nur bis 2 zählt und dann nicht mehr Weiter. War mir erst nicht bewuss, da mein Datensatz noch so klein war.
    Das ist jetzt allerdings sehr komisch.
    Den Fehler muss ich erst mal finden.

    Gruß
  • Hey danke für deine Antwort.
    Das stimmt, den Fehler habe ich gerade selber gefunden.
    Ich habe es nun umgeschrieben.
    Hab das cursor.moveToNext und cursor.moveToPrevious gefunden.
    Jetzt aber immer noch ein Problem
    Das Forward funktioniert jetzt perfekt.
    Das Backward(Previous) allerdings immer noch nicht. (er fängt dann wieder bei -1 an anstatt beim letzten Stand von Forward)
    Der Grund ist warscheinlich dass er gegenüber Forward zu Backward eine neue SQLiteCursor@xxxx nummer zieht. Sieht man auf jeden Fall beim debuggen(weis jetzt nicht ob man das Instance nennt).
    Hab schon einiges probiert, aber finde erst mal keine einfache Lösung dafür.
    Gibt es da eine Möglichkeit, damit für beide Buttons das selbe verwendet wird, oder wie geht man da richtig vor.


    Quellcode

    1. public void ForwardData() {
    2. btnForward.setOnClickListener(new View.OnClickListener() {
    3. Cursor cursor = butterflyDB.forwardData(); // muss hier platziert werden, innerhalb von onCLick würde immer eine neue Instanz SQLiteCursor@xxxx gezogen werden.
    4. @Override
    5. public void onClick(View v) {
    6. //Cursor cursor = butterflyDB.forwardData();
    7. if (cursor.getPosition() < cursor.getCount()-1) { //-1 > ansonsten läuft er auf einen Fehler beim letzen Eintrag
    8. cursor.moveToNext();
    9. etID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    10. etName1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    11. etName2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    12. }
    13. }
    14. });
    15. }
    16. public void BackwardData(){
    17. btnBackward.setOnClickListener(new View.OnClickListener() {
    18. Cursor cursor = butterflyDB.forwardData(); // muss hier platziert werden, innerhalb von onCLick würde immer eine neue Instanz SQLiteCursor@xxxx gezogen werden
    19. @Override
    20. public void onClick(View v) {
    21. //Cursor cursor = butterflyDB.backwarddData();
    22. if (cursor.getPosition() > 0) {
    23. cursor.moveToPrevious();
    24. etID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    25. etName1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    26. etName2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    27. }
    28. }
    29. });
    Alles anzeigen
  • du fragst jedes mal die Datenbank neu ab und bekommst somit immer wieder einen neuen cursor zurück der nach der Abfrage immer auf Anfang steht. Entweder du fragst die Datenbank nur ein mal ab und nicht in den Klick Methoden. Oder du setzt den cursor wider auf die alte Position.
    Ein Feedback auf Tipps ist auch schön. :P
  • Danke für eure Antworten

    Also sdo mit dem forwardData(); war ein Test und den hab ich leider in meiner Frage vergessen wieder zu korrigieren.
    Das ist leider nicht die Lösung.

    a) Wie setzte ich denn am besten den Cursor innerhalb 2 Methoden wieder auf die alte Position. Also von Forward zu Backward und Backward zu Forward.
    Das ist mir nicht so klar. bzw. mir fällt gerade nicht ein wie.



    b) wie frage ich die Datenbank nur ein mal ausserhalb der Methoden ab. Dann hätte ich doch ein Problem wenn ich z.B. zwischen durch mal ein Add, oder Update fahren würde ?
  • Andy61 nein das ist nicht der Fehler. In der Methode wird ein neuer Cursor estellt und die Datenbank neu abgefragt .
    Somit ist die Position des
    Cursors wieder am Anfang wenn dann der Cursor dekrementiert wird ist er -1.


    herrm_no wie so machst du das mit den Klick Methoden so umständlich?

    Den onklickhandler weist du erst in der Backward und Forward Methode zu wie so ?

    würde das in der onCreat machen. Wenn du das machst weil die Button erst ab einer bestimten zeit zur verfügung stehen sollen. Dann setze sie einfach inacktiv und später wieder acktiv.

    Somit hast du nur noch eine onKick Methode in dieser wierd das View mitgegeben was geklickt wurde. Über die Id kannst eine abrage mit shwitch case machen.

    Quellcode

    1. public class Main_Aactivitv extends Activity implements View.OnClickListener {
    2. Button btnForward, btnBackward;
    3. Cursor cursor;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView((int) R.layout.activity_main);
    8. ((Button) findViewById(R.id.btn_forward)).setOnClickListener(this);
    9. ((Button) findViewById(R.id.btn_backward)).setOnClickListener(this);
    10. cursor = butterflyDB.forwardData();
    11. }
    12. @Override
    13. public void onClick(View v) {
    14. switch (v.getId()) {
    15. case R.id.btn_forward:
    16. if (cursor.getPosition() < cursor.getCount()-1) {
    17. cursor.moveToNext();
    18. }
    19. break;
    20. case R.id.btn_backward:
    21. if (cursor.getPosition() > 0) {
    22. cursor.moveToPrevious();
    23. }
    24. break;
    25. }
    26. etID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    27. etName1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    28. etName2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    29. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • Quellcode

    1. public class Main_Aactivitv extends Activity implements View.OnClickListener {
    2. Button btnForward, btnBackward;
    3. int pos;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView((int) R.layout.activity_main);
    8. ((Button) findViewById(R.id.btn_forward)).setOnClickListener(this);
    9. ((Button) findViewById(R.id.btn_backward)).setOnClickListener(this);
    10. }
    11. @Override
    12. public void onClick(View v) {
    13. Cursor cursor = butterflyDB.forwardData();
    14. if ( cursor.getCount() >= pos) cursor.moveToPosition(pos);
    15. switch (v.getId()) {
    16. case R.id.btn_forward:
    17. if (cursor.getPosition() < cursor.getCount()-1) {
    18. cursor.moveToNext();
    19. pos = cursor.getPosition();
    20. }
    21. break;
    22. case R.id.btn_backward:
    23. if (cursor.getPosition() > 0) {
    24. cursor.moveToPrevious();
    25. pos = cursor.getPosition();
    26. }
    27. break;
    28. }
    29. etID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    30. etName1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    31. etName2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    32. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P
  • Ok, danke
    das ist ein Vorschlag den ich Verstehe und auch umsetzen könnte.
    so weit ich es richtig gelesen habe, kann man doch nur ein implements View.OnClickLisetener erstellen (Radio Button)
    Was mache ich wenn ich aber zusätzlich noch eine CheckBox und vielleicht noch eine Listbox (und auch noch eine Seekbar) habe.
    Das ist in dem Programm noch nicht enthalten. Aber ich bin mit dem kleinen Programm dabei zu testen wie ich das in meinem Hauptprogramm umsetzen kann.
    Stoße ich da wieder auf ein zusätzliches Problem.



    Gruß

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von herrm_no ()

  • Hi du kannst doch jedem View im XML eine id geben, und jede dann im Clicklistner prüfen.
    Ansonsten hast du immer noch die Möglichkeit dem Element einen eigenen Klicklistner zu geben.

    Du hast auch immer die Möglichkeit im XML eine KlickMetode mit zugeben
    "android:onClick="onKlick" wenn du für alle die gleiche Methode angiebst, kannst du auch die Unterscheidung über die ID machen.
    Dazu brauchst du dann den Lister nicht in der Klasse zu Implenentieren.
    Beachte das geht nur in eine Activity nicht in einen Fragmant da must du den Listner Implenentieren und kanst die
    "android:onClick=..." nicht nutzen.

    Was meinst du mit nur einen View.OnClickLisetener erstellen? Du brauchst doch auch nur einen den Widges, RadioButton ,Checkbox, Spinner ... sind alles Ellemente von der Klasse "View" somit kommen alle Klick Ereignisse auch dort an und somit in deinen Listner "public void onClick(View v)" . Deshalb ID setzen und auswerten.
    Wichtig ist,fals du es nicht weisst, immer das break am Ende der Case Anweisung, sonst läuft der Switsh weiter zu nächsten Case Anweisung wass man meistens nicht will.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • So, ich habe deinen Vorschlag beherzigt und es Umbegbaut.
    Ich habe auch noch eine extra Klasse dafür geschrieben. (ExternalOnCLickListener)
    Nun funktioniert alles Perfekt
    Danke, Danke , Danke
    Das hat mich nun wirklich Stunden gekostet.
    Man bekommt halt nichts um sonst :) aber die Hilfe vom Forum und besonders von Dir ist unschlagbar.

    Hier mein Code für alle anderen Anfänger

    Main Activity

    Quellcode

    1. package com.herrm_no.datenbanktest;
    2. import android.support.v7.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.view.View;
    5. import android.widget.Button;
    6. import android.widget.CheckBox;
    7. import android.widget.EditText;
    8. import android.widget.RadioButton;
    9. public class MainActivity extends AppCompatActivity {
    10. //DataBaseHelper butterflyDB;
    11. public Button btnAddData;
    12. public Button btnViewData;
    13. public Button btnUpdate;
    14. public Button btnDelete;
    15. public Button btnForward;
    16. public Button btnBackward;
    17. EditText etName1,etName2,etID;
    18. RadioButton etRadio;
    19. CheckBox etCheckbox;
    20. public boolean test;
    21. @Override
    22. protected void onCreate(Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_main);
    25. etName1 = (EditText) findViewById(R.id.editText1);
    26. etName2 = (EditText) findViewById(R.id.editText2);
    27. etID = (EditText) findViewById(R.id.editTextID);
    28. btnAddData = (Button) findViewById(R.id.buttonAddData);
    29. btnViewData = (Button) findViewById(R.id.buttonViewData);
    30. btnUpdate = (Button) findViewById(R.id.buttonUpdate);
    31. btnDelete = (Button) findViewById(R.id.buttonDelete);
    32. btnForward = (Button) findViewById(R.id.buttonForward);
    33. btnBackward = (Button) findViewById(R.id.buttonBackward);
    34. etRadio = (RadioButton) findViewById(R.id.radioButton1);
    35. etCheckbox = (CheckBox) findViewById(R.id.checkBox1);
    36. test = etRadio.isChecked(); // status auslesen
    37. etRadio.setChecked(true); // status setzen
    38. test = etCheckbox.isChecked();
    39. etCheckbox.setChecked(true);
    40. ExternalOnClickListener listener = new ExternalOnClickListener(this);
    41. listener.et1Name2 = etName2;
    42. listener.et1Name1 = etName1;
    43. listener.et1ID = etID;
    44. listener.et1Radio = etRadio;
    45. // hier werden die OnClickListeners von listener der Buttons an die Classe übergeben
    46. btnForward = (Button) findViewById(R.id.buttonForward);
    47. btnForward.setOnClickListener(listener); // hier übergibt er den Button als onclicklistener
    48. btnBackward =(Button) findViewById(R.id.buttonBackward);
    49. btnBackward.setOnClickListener(listener);
    50. btnViewData = (Button) findViewById(R.id.buttonViewData);
    51. btnViewData.setOnClickListener(listener);
    52. btnAddData = (Button) findViewById(R.id.buttonAddData);
    53. btnAddData.setOnClickListener(listener);
    54. btnUpdate = (Button) findViewById(R.id.buttonUpdate);
    55. btnUpdate.setOnClickListener(listener);
    56. btnDelete = (Button) findViewById(R.id.buttonDelete);
    57. btnDelete.setOnClickListener(listener);
    58. }
    59. }
    Alles anzeigen

    Java ExternalOnClickListener

    Quellcode

    1. package com.herrm_no.datenbanktest;
    2. import android.app.AlertDialog;
    3. import android.content.Context;
    4. import android.content.DialogInterface;
    5. import android.database.Cursor;
    6. import android.text.Editable;
    7. import android.util.AndroidException;
    8. import android.view.View;
    9. import android.widget.EditText;
    10. import android.widget.RadioButton;
    11. import android.widget.TextView;
    12. import android.widget.Toast;
    13. /**
    14. * Created by Internet on 30.08.2017.
    15. */
    16. class ExternalOnClickListener implements View.OnClickListener {
    17. public EditText et1Name1;
    18. public EditText et1Name2;
    19. public EditText et1ID;
    20. public RadioButton et1Radio;
    21. public int pos;
    22. public Context context;
    23. public ExternalOnClickListener(Context current)
    24. {
    25. this.context = current;
    26. }
    27. @Override public void onClick (View v)
    28. {
    29. // TODO: add code here
    30. DataBaseHelper butterflyDB = new DataBaseHelper(this.context);
    31. Cursor cursor = butterflyDB.forwardData();
    32. // hier Definition welcher Button gerade gedrückt wurde.
    33. if (cursor.getCount() >= pos) cursor.moveToPosition(pos);
    34. switch (v.getId())
    35. {
    36. case R.id.buttonForward: // hier vergleicht er die v.getID() des übergebenen OnCLickLIsterners mit der R.id des buttons.
    37. if (cursor.getPosition() < cursor.getCount() - 1)
    38. {
    39. cursor.moveToNext();
    40. pos = cursor.getPosition();
    41. }
    42. break;
    43. case R.id.buttonBackward:
    44. if (cursor.getPosition() > 0)
    45. {
    46. cursor.moveToPrevious();
    47. pos = cursor.getPosition();
    48. }
    49. break;
    50. case R.id.buttonViewData:
    51. Cursor data = butterflyDB.showData();
    52. if(data.getCount() == 0){
    53. //message
    54. display("Error","No Data Found");
    55. return;
    56. }
    57. StringBuffer buffer = new StringBuffer();
    58. while(data.moveToNext()) {
    59. buffer.append("IDx " + data.getString(0) + "\n"); // 0 = die Erste Spalte in der Datenbank
    60. buffer.append("NAME1x " + data.getString(1) + "\n");
    61. buffer.append("NAME2x " + data.getString(2) + "\n");
    62. buffer.append("RBx " + data.getString(3) + "\n");
    63. }
    64. //message
    65. display("All stored Data", buffer.toString());
    66. // return;
    67. break;
    68. case R.id.buttonAddData:
    69. {
    70. String name1 = et1Name1.getText().toString();
    71. String name2 = et1Name2.getText().toString();
    72. String rb1 = et1Radio.getText().toString();
    73. // String id = etID;
    74. boolean insertData = butterflyDB.addData(name1,name2,rb1);
    75. if (insertData == true){
    76. Toast.makeText(context, "Data Succsessfully Transfered", Toast.LENGTH_LONG).show();
    77. }
    78. else { Toast.makeText(context, "Data Wrong Transfered", Toast.LENGTH_LONG).show();
    79. }
    80. break;
    81. }
    82. case R.id.buttonUpdate:
    83. {
    84. int temp = et1ID.getText().toString().length();
    85. if (temp >0)
    86. {
    87. boolean update = butterflyDB.updateData(et1ID.getText().toString(),et1Name1.getText().toString(),et1Name2.getText().toString(),et1Radio.getText().toString()); // das ist die Reihenfolge welche in der DataBaseHelper unter Update festgelegt wurden
    88. if(update = true)
    89. {
    90. Toast.makeText(context, "Update OK" , Toast.LENGTH_LONG).show();
    91. }
    92. else{
    93. Toast.makeText(context, "Update not OK" , Toast.LENGTH_LONG).show();
    94. }
    95. }
    96. else
    97. {
    98. Toast.makeText(context, "You must Enter an ID to Update" , Toast.LENGTH_LONG).show();
    99. }
    100. break;
    101. }
    102. case R.id.buttonDelete:
    103. {
    104. int temp = et1ID.getText().toString().length();
    105. if (temp >0)
    106. {
    107. Integer deleteRow = butterflyDB.deleteData(et1ID.getText().toString()); // das ist die Reihenfolge welche in der DataBaseHelper unter Update festgelegt wurden
    108. if(deleteRow > 0)
    109. {
    110. Toast.makeText(context, "Successfully Deletet" , Toast.LENGTH_LONG).show();
    111. }
    112. else
    113. {
    114. Toast.makeText(context, "Not Deleted" , Toast.LENGTH_LONG).show();
    115. }
    116. }
    117. else
    118. {
    119. Toast.makeText(context, "You must Enter an ID to Update" , Toast.LENGTH_LONG).show();
    120. }
    121. break;
    122. }
    123. }
    124. // übergabe aller Texte an die Textboxen. Das könnte man aber auch wenn nötig zu den Forward und Backward Cases verschieben.
    125. et1ID.setText(cursor.getString(0), TextView.BufferType.EDITABLE);
    126. et1Name1.setText(cursor.getString(1), TextView.BufferType.EDITABLE);
    127. et1Name2.setText(cursor.getString(2), TextView.BufferType.EDITABLE);
    128. et1Radio.setText(cursor.getString(3), TextView.BufferType.EDITABLE);
    129. }
    130. // spezieller view von einem Text wie in Visual Basic eine Message
    131. public void display(String title, String message){
    132. AlertDialog.Builder builder = new AlertDialog.Builder(context);
    133. builder.setCancelable(true);
    134. builder.setTitle(title);
    135. builder.setMessage(message);
    136. builder.show();
    137. }
    138. }
    Alles anzeigen