2015-08-07 7 views
5

numaralı 170 satırından sonra çöktü.Android SQLite, 170 satırın üzerinde çalışmak üzere bu mantığın nasıl değiştirileceği

// Getting All test 
public List<Test> getAllTests(String str) { 
    List<Test> testList = new ArrayList<Test>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_TESTS; 

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

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      //select rows by input string 
      if(cursor.getString(1).equals(str)){ 
       Test test = new Test(); 
       test.setId(Integer.parseInt(cursor.getString(0))); 
       test.setTest(cursor.getString(1)); 
       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; 
} 

Tüm satırları giriş dizesiyle seçmek istiyorum. Bu mantık 150 satırlarla mükemmel iş ama EDITED 170 satır

+1

Neden etmek yerlerinde verileri almak için LIMIT kullanmayı şekilde biçimlendirmek

// 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/ ); 

başka yaklaşım aşağıdaki farklı aynı kodu kullanarak ve OFFSET deneyebilir misiniz İsteğinizde WHERE yan tümcesi kullanıyor musunuz? –

+0

İmleç ile çalışıyorum cursor = db.rawQuery ("SELECT * FROM" + TABLE_TESTS + "WHERE name =" + str, null); ama düştü –

+0

Gördüğünüz kaza nedir? Açıklama "160 yavaş çalışıyor ve 170 satırda çökme" açıklamasından uygulama yanıt vermiyor sanırım ve bu durumda sorun muhtemelen başka bir yerde ya da sadece UI iş parçacığı üzerinde veritabanı kodu çağırıyorsun. – laalto

cevap

4

170'den fazla satırla çalışmak için bu mantığı nasıl değiştirebilirim?

// 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 Teşekkürler! İşiniz, elbette yavaş ama işe yarıyor (2 saniye/150 satır ve 13 sn/1500 satır) –

+1

@AleksandarKrasimirov, bunu bilmek güzel. Bu siteye yeni olduğunuzdan beri. Faydalı/doğru bir cevabı nasıl kabul edeceğiniz konusunda size rehberlik edeyim. Sadece cevabın yanında yeşil onay işaretini işaretleyin. – Kedarnath

+0

Teşekkürler :) ben işaretli –

2

160 yavaş yavaş iş ve kazadan sonra: mispelled YÖNTEMİ

sorgu yapı olarak

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

Kullanım ve ardından son satırın takip Bu gibi kimlik, döngü her bittiğinde, sadece tekrar sorgulayın db; satırlar ihtiyacınız olan bir sonraki satırdan alınacak, çünkü last_id değişkeni ilerlemenize göre dinamik olarak değişecektir.

+0

" Tamsayı kimlik alanınızı nasıl çağırdığınızı bilmediğinizde, ben_id; Bunu, DB'nizdeki gerçek sütun adıyla değiştirmelisiniz. – StG

+0

Bana bu yöntem valueof (java.lang.String) çözümlenemiyor ve neden bunu "LIMIT 150" yapmıyorsunuz? –

+0

İkinci sütununun adı nedir? – Kedarnath

1

don performansını artırmak

// 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; 
} 
İlgili konular