错误 - android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0

时间:2012-05-13 18:00:43

标签: android database

我正在试图建立一个数据库,但我有一个问题......

这是日志:

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

这是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;
    }
}

这是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);

    }
}

这是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:
}
    }}

和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);
    }

}

我不知道出了什么问题......你能帮助我吗?如果您将回答,那将是很好的,您将使用简单易懂的语言。

2 个答案:

答案 0 :(得分:7)

fetchItemByType中检查cursor.moveToFirst()是否返回true如果没有,那么你没有任何数据,你可以返回-1。 我认为CursorIndexOutOfBoundsException没有被你的程序捕获,0从fetchItemByType函数返回。

答案 1 :(得分:0)

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

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