2012-05-13 34 views
5

Tôi triying để làm một cơ sở dữ liệu, nhưng tôi có một vấn đề ...Lỗi - android.database.CursorIndexOutOfBoundsException: Index 0 yêu cầu, với kích thước từ 0

Đây là nhật ký:

E/AndroidRuntime(894): FATAL EXCEPTION: main 
E/AndroidRuntime(894): java.lang.IllegalStateException: Could not execute method of the activity 
E/AndroidRuntime(894): at android.view.View$1.onClick(View.java:3044) 
E/AndroidRuntime(894): at android.view.View.performClick(View.java:3511) 
E/AndroidRuntime(894): at android.view.View$PerformClick.run(View.java:14105) 
E/AndroidRuntime(894): at android.os.Handler.handleCallback(Handler.java:605) 
E/AndroidRuntime(894): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(894): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(894): at android.app.ActivityThread.main(ActivityThread.java:4424) 
E/AndroidRuntime(894): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(894): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
E/AndroidRuntime(894): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
E/AndroidRuntime(894): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(894): Caused by: java.lang.reflect.InvocationTargetException 
E/AndroidRuntime(894): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(894): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(894): at android.view.View$1.onClick(View.java:3039) 
E/AndroidRuntime(894): ... 11 more 
E/AndroidRuntime(894): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
E/AndroidRuntime(894): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400) 
E/AndroidRuntime(894): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
E/AndroidRuntime(894): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74) 
E/AndroidRuntime(894): at and.mGroup.VirtualTrener.DatabaseControl.fetchItemByType(DatabaseControl.java:59) 
E/AndroidRuntime(894): at and.mGroup.VirtualTrener.DatabaseManageActivity.onClick(DatabaseManageActivity.java:48) 
E/AndroidRuntime(894): ... 14 more 

đây là DatabaseControl.java:

public class DatabaseControl { 

    private static final String KEY_ROWID = "_id"; 
    private static final String KEY_NAME = "NAME"; 
    private static final String KEY_BKI = "BKI"; 
    private static final String KEY_CKM = "CKM"; 

    private static final String DATABASE_TABLE ="inventory"; 

    private Context context; 
    private SQLiteDatabase database; 
    private DatabaseHelper dbHelper; 

    public DatabaseControl(Context context){ 
     this.context = context; 
    } 

    public DatabaseControl open() throws SQLiteException { 
     dbHelper = new DatabaseHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

    public long addItem(String NAME, int BKI, int CKM) { 
     ContentValues setUpVals = CreateContentValues(NAME,BKI,CKM); 
     return database.insert(DATABASE_TABLE, null, setUpVals); 

    } 



    public boolean updateItem (long id, String NAME, int BKI, int CKM){ 
     ContentValues updateVals = CreateContentValues(NAME,BKI,CKM); 

     return database.update(DATABASE_TABLE, updateVals, KEY_ROWID + "="+ id, null) > 0; 
    } 


    public long fetchItemByType(String type){ 
     Cursor dbCursor; 

     long id =0; 
     try { 
      dbCursor = database.query(true, DATABASE_TABLE, new String[]{KEY_ROWID},KEY_NAME + "= '" + type + "'" , null, null, null, null, null); 
      dbCursor.moveToFirst(); 
      id = dbCursor.getLong(dbCursor.getColumnIndex(KEY_ROWID)); 
     } catch (SQLiteException e) { 
      id = -1; 
     } 
     return id;  
    } 

    public String fetchAllItems(){ 
     String allData = ""; 

     Cursor dbCursor; 
     try { 
      dbCursor = database.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_BKI, KEY_CKM}, null, null, null, null, null); 
      //dbCursor.getCount(); 
      int iRow = dbCursor.getColumnIndex(KEY_ROWID); 
      int iName = dbCursor.getColumnIndex(KEY_NAME); 
      int iBKI = dbCursor.getColumnIndex(KEY_BKI); 
      int iCKM = dbCursor.getColumnIndex(KEY_CKM); 

      for (dbCursor.moveToFirst(); !dbCursor.isAfterLast(); dbCursor.moveToNext()) 
      { 
       allData = allData + " " + dbCursor.getString(iRow) + "\t" + dbCursor.getString (iName) + "\t" + dbCursor.getString (iBKI) + "\t" + dbCursor.getString (iCKM) + "\n"; 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      allData = ""; 

     } 
     return allData; 
    } 

    public boolean deleteItem(long id){ 
     return database.delete(DATABASE_TABLE, KEY_ROWID + "=" + id, null) > 0; 
    } 

    private ContentValues CreateContentValues(String nAME, int bKI, int cKM) { 
     // TODO Auto-generated method stub 
     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, nAME); 
     values.put(KEY_BKI, bKI); 
     values.put(KEY_CKM, cKM); 
     return values; 
    } 
} 

đây là DatabaseHelper.java:

public class DatabaseHelper extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME = "ItemInventorydb"; 
    private static final int DATABASE_VERSION = 1; 


    private static final String DATABASE_CREATE = "CREATE TABLE inventory (" + 
    "_id integer PRIMARY KEY AUTOINCREMENT," + 
      "NAME text," + 
      "BKI integer," + 
      "CKM integer" + 
      ");"; 


    public DatabaseHelper (Context context){ 
     super(context, DATABASE_NAME,null,DATABASE_VERSION); 

    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DATABASE_CREATE); 

    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXIST inventory"); 
     onCreate(db); 

    } 
} 

Đây là DatabaseManageActivity.java:

public class DatabaseManageActivity extends Activity { 

    private EditText nazwaInput; 
    private EditText bkiInput; 
    private EditText ckmInput; 
    private DatabaseControl dbControl; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.wejscie_sesje); 
     dbControl = new DatabaseControl(this); 
     nazwaInput = (EditText) findViewById(R.id.name); 
    } 

    public void onClick(View arg){ 
     String nazwaData = nazwaInput.getText().toString().toLowerCase(); 
     //String bkiData = bkiInput.getText().toString(); 
     //String ckmData = ckmInput.getText().toString(); 
     Dialog notice = new Dialog(this); 
     TextView msgBody = new TextView(this); 
     msgBody.setTextSize(20); 
     long tempVal =0; 


     switch (arg.getId()){ 
     case R.id.addItem: 

      try { 
       //int bkiDataAsNum =Integer.parseInt(bkiData); 
       //int ckmDataAsNum =Integer.parseInt(ckmData); 
       int bkiDataAsNum = 3500; 
       int ckmDataAsNum = 24; 
       dbControl.open(); 

       if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){ 
        if(dbControl.updateItem(tempVal, nazwaData, bkiDataAsNum, ckmDataAsNum)){ 
         notice.setTitle("Zaktualizowano!"); 
         msgBody.setText("Item, który istniał zostal zaktualizowany"); 
        } 
        else { 
         notice.setTitle("Aktualizacja zakończona niepowodzeniem"); 
         msgBody.setText("Item, ktory istniał nie został zaktualizowany"); 
        } 
       } 
       else { 
        long rowId =0; 
        rowId = dbControl.addItem(nazwaData, bkiDataAsNum, ckmDataAsNum); 
        notice.setTitle("Item umieszczony!"); 
        msgBody.setText("Item umieszczony na pozycji" + rowId); 
       } 
       dbControl.close(); 
      } 
      catch (SQLiteException e) { 
       e.printStackTrace(); 
       notice.setTitle("Umieszczenie zakończone niepowodzeniem !"); 
       msgBody.setText("Błąd SQL"); 
      } 
      catch (NumberFormatException e) { 
       e.printStackTrace(); 
       notice.setTitle("Umieszczenie zakończone niepowodzeniem!"); 
       msgBody.setText("Wartość musi być wartością numeryczną!"); 
     } 
     notice.setContentView(msgBody); 
     notice.show(); 
     break; 

     case R.id.updateItem: 


      try{ 
       //int bkiDataAsNum =Integer.parseInt(bkiData); 
       int bkiDataAsNum = 3500; 
       int ckmDataAsNum = 24; 
       //int ckmDataAsNum =Integer.parseInt(ckmData); 

       dbControl.open(); 

       if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){ 
        if(dbControl.updateItem(tempVal, nazwaData, bkiDataAsNum, ckmDataAsNum)){ 
         notice.setTitle("Zaktualizowano!"); 
         msgBody.setText("Item, zostal zaktualizowany"); 
        } 
        else { 
         notice.setTitle("Aktualizacja zakończona niepowodzeniem"); 
         msgBody.setText("Aktualizacja zakończona niepowodzeniem, nie znaleziono rekordów"); 
        } 
       } 
       else 
       { 
        notice.setTitle("Aktualizacja zakończona niepowodzeniem"); 
        msgBody.setText("Item nie został znaleziony!"); 
       } 
       dbControl.close(); 


    } 
      catch (SQLiteException e) { 
       e.printStackTrace(); 
       notice.setTitle("Update zokończony niepowodzeniem!"); 
       msgBody.setText("Błąd SQL"); 
      } 
      catch (NumberFormatException e) { 
       e.printStackTrace(); 
       notice.setTitle("Update zokończony niepowodzeniem!"); 
       msgBody.setText("Wartość musi być wartością numeryczną!"); 
     } 
     notice.setContentView(msgBody); 
     notice.show(); 
     break; 

     case R.id.deleteItem: 

      try{ 

       dbControl.open(); 

       if ((tempVal = dbControl.fetchItemByType(nazwaData)) != -1){ 
        if(dbControl.deleteItem(tempVal)){ 
         notice.setTitle("Usunięto!"); 
         msgBody.setText("Item, zostal usunięty"); 
        } 
        else { 
         notice.setTitle("Usunięcie zakończone niepowodzeniem"); 
         msgBody.setText("Usunięcie zakończone niepowodzeniem, nie znaleziono rekordów"); 
        } 
       } 
       else 
       { 
        notice.setTitle("Usunięcie zakończone niepowodzeniem"); 
        msgBody.setText("Item nie został znaleziony!"); 
       } 
       dbControl.close(); 


    } 
      catch (SQLiteException e) { 
       e.printStackTrace(); 
       notice.setTitle("Usunięcie zakończone niepowodzeniem!"); 
       msgBody.setText("Błąd SQL"); 
      } 

     notice.setContentView(msgBody); 
     notice.show(); 
     break; 

     case R.id.viewData: 
      Intent i = new Intent("android.intent.action.DatabaseViewer"); 
      startActivity(i); 
      break; 
      default: 
} 
    }} 

và DatabaseViewer.java:

public class DatabaseViewer extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.dataview); 
     TextView content = (TextView) findViewById(R.id.dataOutput); 
     DatabaseControl control = new DatabaseControl(this); 
     String result = "_id\t NAME\t BKI\t CKM \n "; 

     try { 
      control.open(); 
      result = result + ""+ control.fetchAllItems(); 
      control.close(); 
     } 
     catch (SQLiteException e) { 
      e.printStackTrace(); 
     } 
     content.setText(result); 
    } 

} 

tôi không có ý tưởng gì là sai ... Bạn có thể giúp tôi? Nó sẽ được tốt đẹp, khi nếu bạn sẽ trả lời, bạn sẽ sử dụng đơn giản để hiểu ngôn ngữ.

Trả lời

7

Trong fetchItemByType kiểm tra xem cursor.moveToFirst() có trả về true nếu không thì bạn không có bất kỳ dữ liệu nào và bạn có thể trả về -1. Tôi nghĩ rằng CursorIndexOutOfBoundsException không bị bắt trong chương trình của bạn và 0 đang được trả về từ hàm fetchItemByType.

+0

Tôi không chắc chắn, có các biến từ dbCursor: http://pastebin.com/cQYQzSFn –

+0

Ứng dụng của bạn đang rơi trong chức năng 'fetchItemByType dài công cộng (String type) {' tại dòng 'id = dbCursor.getLong (dbCursor.getColumnIndex (KEY_ROWID)); ' Trước khi gọi' dbCursor.getLong ... 'kiểm tra xem bạn có bất kỳ dữ liệu nào trong con trỏ hay không. ví dụ. Kiểm tra 'if (dbCursor.moveToFirst())' và sau đó gọi 'getLong() ..' – Tarun

+0

nếu (dbCursor.moveToFirst()) có giá trị FALSE. Đây có phải là sự cố không? –

0
if (cursor!= null && cursor.moveToFirst()){ 
    while (!cursor.isAfterLast()) { 
         str = String.valueOf(cursor.getInt(1)); 

         arrayList.add(str); 
         cursor.moveToNext(); 
        } 
        cursor.close(); 
    } 
+1

Hãy quan tâm để xây dựng logic và không phải một số mã. Cũng cho chúng tôi biết cách logic này sẽ trả lời câu hỏi gốc. Cảm ơn. – instaable

+0

Vui lòng đăng một số mô tả cho giải pháp của bạn mà không cần đăng mã. – tarzanbappa

Các vấn đề liên quan