2015-08-07 9 views
5

wie diese Logik ändern, um mit mehr als 170 Zeilen zu arbeiten.Android-SQLite stürzte nach 170 Zeile

Ich möchte alle Zeilen nach Eingabezeichenfolge auswählen. Es Logik arbeitet perfekt mit 150 Zeilen, aber nach 160 Arbeit langsam und Absturz auf 170 Zeilen

+1

Warum don zu verbessern Verwenden Sie in Ihrer Anfrage keine WHERE-Klausel? –

+0

Ich versuche mit Cursor cursor = db.rawQuery ("SELECT * FROM" + TABLE_TESTS + "WHERE name =" + str, null); aber abgestürzt –

+0

Was ist der Absturz, den Sie sehen? Von der Beschreibung "nach 160 arbeiten langsam und Absturz auf 170 Zeilen" würde raten, dass die Anwendung nicht reagiert und in diesem Fall ist das Problem möglicherweise woanders oder nur, dass Sie Datenbankcode auf dem UI-Thread aufrufen. – laalto

Antwort

4

Wie kann diese Logik geändert werden, um mit mehr als 170 Zeilen zu arbeiten?

// Getting All test 
public List<Test> getAllTests(String str) { 
    List<Test> testList = new ArrayList<Test>(); 
    // Select All Query 

    //String selectQuery = "SELECT * FROM " + TABLE_TESTS; 
String selectQuery = "SELECT id,result FROM " + TABLE_TESTS + " where name ='" + str + "'"; 
    // Now you are saving memory of one column. 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
      Test test = new Test(); 
      // moved outside loop to prevent creating new object every time. 
     do { 
      //select rows by input string 
      //if(cursor.getString(1).equals(str)){ 
      // No need for if Codition any more 
       test.setId(Integer.parseInt(cursor.getString(0))); 
       //test.setTest(cursor.getString(1)); 
       test.setTest(str); 
       test .setResult(Integer.parseInt(cursor.getString(2))); 
       // Adding test to list 
       testList.add(test); 
      //} 
     } while (cursor.moveToNext()); 
    } 
    //close database 
    db.close(); 

    //return list data  
    return testList; 
} 
+0

@ Kedarnath Danke! Ihre Arbeit, natürlich langsam, aber Arbeit. (2 Sekunden/150 Zeilen und 13 Sekunden/1500 Zeilen) –

+1

@AleksandarKrasimirov, das ist gut zu wissen. Da bist du neu auf dieser Seite. Lass mich dir zeigen, wie du eine nützliche/richtige Antwort akzeptierst. Aktivieren Sie einfach neben der Antwort das grüne Häkchen. – Kedarnath

+0

Danke :) Ich tickte –

2

EDITED: mispelled METHODE

Verwenden

String selectQuery = "SELECT * FROM " + TABLE_TESTS + " WHERE " + your_id + " > " + String.valueOf(last_id) + " LIMIT 150"; 

als Abfragestruktur, und dann verfolgt die letzten Zeile id like this

int last_id; 
do { 
     //select rows by input string 
     if(cursor.getString(1).equals(str)){ 
      Test test = new Test(); 
      last_id = Integer.parseInt(cursor.getString(0)); 
      test.setId(last_id); 
      ... 
     } 
    } while (cursor.moveToNext()); 

Jedes Mal, wenn die Schleife endet, nur noch einmal Ihre DB abfragen; Die Zeilen werden von der nächsten abgerufen, die Sie benötigen, da sich die Variable last_id abhängig von Ihrem Fortschritt dynamisch ändert.

+0

Beachten Sie, dass, nicht zu wissen, wie Sie Ihr Integer-ID-Feld aufgerufen habe, habe ich die Geistervariable your_id; Sie sollten das durch den tatsächlichen Spaltennamen in Ihrem DB ersetzen. – StG

+0

Es gibt mir kann Methode Wertof (java.lang.String) und warum Sie diese "LIMIT 150" machen nicht auflösen? –

+0

Wie lautet der Name Ihrer zweiten Spalte? – Kedarnath

1

könnte versuchen, anders gleichen Code Weise in folgenden

// using sql query Differently 
(SQliteDatabase) db.query(
    "TABLE_TESTS"/table name /, 
    new String[] { "id", "result" }/columns names /, 
    "name = ?"/where or selection /, 
    new String[] { str }/selectionArgs i.e. value to replace ? /, 
    null/groupBy /, 
    null/having /, 
    null/orderBy/
); 

Einen anderen Ansatz könnte LIMIT verwenden und Offset-Daten in Teilen zu bekommen Leistung

// using LIMIT AND OFFSET 
public List<Test> getAllTests(String str) { 

List<Test> testList = new ArrayList<Test>(); 
// Select All Query 

      Integer count = 0; 
      String countQuery = "SELECT count(id) FROM " + TABLE_TESTS; 
      SQLiteDatabase db = this.getWritableDatabase(); 
Cursor cursor = db.rawQuery(countQuery, null); 
      if (cursor.moveToFirst()) { 
          count= c.getCount(); 
      } 
      db.close(); 

      int MAX_LENGTH = 150; 

      if (count > 0) { 

          int total_length = (count/MAX_LENGTH) + 1; 

          for (int i=0; i<total_length; i++) { 

              String selectQuery = "SELECT id,result FROM " + TABLE_TESTS + " LIMIT " + MAX_LENGTH + " OFFSET " + (i*MAX_LENGTH) ; 

              db = this.getWritableDatabase(); 
              cursor = db.rawQuery(selectQuery, null); 

           // looping through all rows and adding to list 
              if (cursor.moveToFirst()) { 
                   Test test = new Test(); 
                   // moved outside loop to prevent creating new object every time. 
                  do { 
                      //select rows by input string 
                      if(cursor.getString(1).equals(str)){ 
                          test.setId(Integer.parseInt(cursor.getString(0))); 
                          //test.setTest(cursor.getString(1)); 
                          test.setTest(str); 
                          test .setResult(Integer.parseInt(cursor.getString(2))); 
                          // Adding test to list 
                          testList.add(test); 
                      } 
                  } while (cursor.moveToNext()); 
              } 
              //close database 
              db.close(); 

          } 

      } 

//return list data  
return testList; 
} 
Verwandte Themen