2015-08-07 16 views
5

cách thay đổi logic này để hoạt động với hơn 170 hàng.Android SQLite bị lỗi sau 170 hàng

// 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ôi muốn chọn tất cả các hàng theo chuỗi đầu vào. Nó lý công việc một cách hoàn hảo với 150 hàng nhưng sau khi 160 công trình chậm và vụ tai nạn trên 170 hàng

+1

Tại sao don Bạn không sử dụng mệnh đề WHERE trong yêu cầu của bạn? –

+0

Tôi thử với Cursor cursor = db.rawQuery ("SELECT * FROM" + TABLE_TESTS + "WHERE name =" + str, null); nhưng đã bị rơi –

+0

Tai nạn bạn đang gặp phải là gì? Từ mô tả "sau 160 làm việc từ từ và sự cố trên 170 hàng" sẽ đoán ứng dụng không phản hồi và trong trường hợp đó, sự cố có thể ở nơi khác hoặc chỉ là bạn đang gọi mã cơ sở dữ liệu trên chuỗi giao diện người dùng. – laalto

Trả lời

4

cách thay đổi logic này để hoạt động với hơn 170 hàng?

// 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 Cảm ơn! Công việc của bạn, tất nhiên từ từ nhưng làm việc. (2 giây/150rows và 13 giây/1500 hàng) –

+1

@AleksandarKrasimirov, đó là điều tốt để biết. Vì bạn mới vào trang này. Hãy để tôi hướng dẫn bạn cách chấp nhận câu trả lời hữu ích/đúng. Chỉ cần đánh dấu vào dấu tick màu xanh bên cạnh câu trả lời. – Kedarnath

+0

Cảm ơn :) tôi đã chọn –

2

EDITED: gõ sai PHƯƠNG PHÁP

Sử dụng

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

như cấu trúc truy vấn của bạn, và sau đó theo dõi hàng cuối cùng id như thế này`

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

mỗi khi vòng lặp kết thúc, chỉ cần truy vấn lại db của bạn; các hàng sẽ được tìm nạp từ cái tiếp theo bạn cần, vì biến last_id sẽ thay đổi theo sự tiến bộ của bạn.

+0

Lưu ý rằng, không biết làm thế nào bạn gọi là trường số nguyên ID của bạn, tôi đã sử dụng biến ma your_id; bạn nên thay thế bằng tên cột thực trong DB của bạn. – StG

+0

Nó cho tôi Không thể giải quyết phương thức valueof (java.lang.String) và tại sao bạn thực hiện điều này "LIMIT 150"? –

+0

Tên cột thứ hai của bạn là gì? – Kedarnath

1

thể thử sử dụng cùng một mã khác nhau ở sau cách

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

cách tiếp cận khác có thể được sử dụng LIMIT và OFFSET để có được dữ liệu trong phần để cải thiện hiệu suất

// 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; 
} 
Các vấn đề liên quan