2016-10-12 3 views
0

Ich habe eine While-Schleife verwendet, um die Werte einer SQL-Tabelle in eine ArrayList mit der Cursor-Klasse hinzuzufügen, aber im Moment des Hinzufügens aller Werte die While-Schleife höre auf, Werte zu geben, aber gleichzeitig geht es nicht weiter mit den nächsten Aussagen. Ich habe folgende Bedingung verwendet: Wenn innerhalb der While-Schleife der Cursor einen Nullwert hat, muss er anhalten (c! = Null), er stoppt, fährt aber nicht fort. Ich habe Log.i verwendet, um zu sehen, ob ich Werte nach der While-Schleife erhalte, aber ich bekomme keinen Wert. Hier ist der Code ich verwende:While-Schleife stoppt, aber nicht mit den nächsten Anweisungen fortgesetzt

static ArrayList<String> notes = new ArrayList<>(); 
static ArrayAdapter arrayAdapter; 

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

    ListView listView = (ListView) findViewById(R.id.listView); 

    try{ 
     SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("Notes",MODE_PRIVATE, null); 
     sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS notes (name VARCHAR)"); 
     sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('LUIS GA')"); 
     sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('LUIS')"); 
     sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('GA')"); 

     Cursor c = sqLiteDatabase.rawQuery("SELECT * FROM notes", null); 
     int nameIndex = c.getColumnIndex("name"); 
     notes.add("example note"); 
     c.moveToFirst(); 
     arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, notes); 
     listView.setAdapter(arrayAdapter); 
     int i = 0; 
     Log.i("Bucefalo", Integer.toString(i)); 

     while(c != null){ 
      Log.i("Dato",c.getString(nameIndex)); 
      notes.add(c.getString(nameIndex)); 
      c.moveToNext(); 
      i++; 
      Log.i("Luis", Integer.toString(i)); 
     }; 
     i = 2; 
     Log.i("Napoleon", Integer.toString(i)); 
     String Hercules = "Hercules"; 
     Log.i("Hercules",Hercules); 
    } 
    catch (Exception e){ 

     e.printStackTrace(); 

    } 

Die Werte, die ich in der Logcat erhalten Log.i verwenden, sind „Bucefalo“ und „Luis“ (die in der While-Schleife), aber ich weiß nicht empfange den Wert "Napoleon" und "Hercules", Warum? Wie kann ich das beheben? Danke

+0

'' Bucefalo'and Luis' verwenden? nicht 'Dato'? – jhamon

+0

Entfernen Sie ';' am Ende der while-Schleife nach '}'. – Ravikumar

+1

@Ravikumar Das wäre wichtig, wenn das ";" würde direkt nach der while (condition) folgen ... aber nach dem ** block ** ist es egal. – GhostCat

Antwort

0

moveToNext gibt einen booleschen Wert zu wiederholen, aber zur gleichen Zeit, es geht voran und bewegt den Cursor.

Verwendung wie diese,

Cursor c = sqLiteDatabase.rawQuery(....); 
while (c.moveToNext()) { 

} 

oder

do { 

} while (c.moveToNext()); 
+0

Danke, ich habe das Detail über den Rückgabewert von moveToNext nicht gesehen –

2

Dies ist die beste Art und Weise durch den Cursor

Cursor cursor = db.rawQuery(...); 
try { 
     while (cursor.moveToNext()) { 
     ... 
    } 
} finally { 
    cursor.close(); 
} 
+0

Sie würden meine Stimme haben, wenn Sie erklären, warum dies der beste Weg ist. Werfen Sie keinen Code auf sein Gesicht so. – AxelH

2

Neben der falsche Verwendung des Cursors, dieser Code

while(c != null){ 
    ... 
    c.moveToNext(); 
} 

sollte eigentlich nie Anschlag Looping.

Sie sehen: Sie haben eine lokale Referenz c dort. Es ist nicht null. Aufrufen einer Methode auf eine Referenz absolut kann nicht drehen Sie die Referenz selbst zu sein null. Nur eine Aufgabe wie c = null würdest du dorthin bekommen.

Mit anderen Worten: Ihre Behauptungen über beobachtetes Verhalten werden von dem Code, den Sie veröffentlichen, nicht unterstützt.

0

Es gibt einen Syntaxfehler in Ihrer während Loop.it unter

while (expression) 
{ 
statemets(s) 
} 

sein sollte und darüber hinaus schlecht Sie verwenden Cursor.

können Sie

cur.moveToFirst(); 
    while (cur.isAfterLast() == false) { 
     ............. 
     ............ 
     cur.moveToNext(); 
    } 
    cur.close(); 

oder
Cursor cursor = db.rawQuery(...); if (cursor.moveToFirst()) { do { ...
} while (cursor.moveToNext()); }
oder

Cursor cursor = db.rawQuery(...); 
try { 
while (cursor.moveToNext()) { 
    ... 
} 
} finally { 
cursor.close(); 
} 
Verwandte Themen