Как я могу пылесосить базу данных SQL?Мой метод для этого не работает - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть база данных следующим методом:

    public void deleteNote(long rowId) { 
    mDb.delete(DATABASE_TABLE, KEY_REALROWID + "=" + rowId, null); 
    int x = (int) rowId; 
    int y = testCount(); 
    while(x<y) 
    {x++; 
    Cursor note= fetchNote(x); 
    ContentValues argsan = new ContentValues(); 
    argsan.put(KEY_REALROWID, x-1); 
    long z = Integer.valueOf(note.getString
(note.getColumnIndexOrThrow(NotesDbAdapter.K EY_ROWID))); 
    mDb.update(DATABASE_TABLE, argsan, KEY_ROWID + "=" + z, null); 
                }} 

Метод вставки следующий:

public void createNote(double value, String isroot, String ispower, 
String ismultiply, String isdivisor, String add, 
String issubtract, double roototpowerval, String 
paranthaseesend, String paranthaseesstart) { 
ContentValues initialValues = new ContentValues(); 
initialValues.put(KEY_VALUE, value); 
initialValues.put(KEY_ISROOT, isroot); 
initialValues.put(KEY_ISPOWER, ispower); 
initialValues.put(KEY_ISMULTIPLIER, ismultiply); 
initialValues.put(KEY_ISDIVISOR, isdivisor); 
initialValues.put(KEY_ISADD, add); 
initialValues.put(KEY_ISSUBTRACT, issubtract); 
initialValues.put(KEY_POWERORROOTNUMBER, roototpowerval); 
initialValues.put(KEY_REALROWID, testCount()+1); 
initialValues.put(KEY_ISPE, paranthaseesend); 
initialValues.put(KEY_ISPS, paranthaseesstart); 
mDb.insert(DATABASE_TABLE, null, initialValues); 
    } 

Метод testCount () таков:

public int testCount() {
     Cursor c = mDb.rawQuery("select count(*) from notes", null);
     int tst = 0;
     if (c.moveToNext()) {
         tst = c.getInt(c.getColumnIndex("count(*)"));
     }
     return tst;
    }

Метод извлечения таков:

    public Cursor fetchNote(long rowId) throws SQLException { 
    Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] 
    {KEY_ISPS,KEY_ISPE,KEY_VALUE, 
    KEY_ISROOT,KEY_REALROWID,KEY_ISPOWER,KEY_POWERORROOTNUMBER,KEY_ISDIVISOR,
KEY_ISMULTIPLIER, KEY_ISADD,KEY_ISSUBTRACT}, 
    KEY_REALROWID + "=" + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
    mCursor.moveToFirst(); 
    } 
    return mCursor; 
        } 

Когда я запускаю это, я получаю сообщение об ошибке:

    mDbHelper.createNote(d, "false", "false", "false", "false",
 "false", "false", 0, "false", "false"); 
    mDbHelper.createNote(0, "false", "false", "false","false",
 "false", "true", 0, "false", "false"); 
    mDbHelper.createNote(d, "false", "false", "false","false",
"false", "false", 0, "false", "false"); 
    mDbHelper.createNote(d, "false", "false", "false","false",
 "false", "false", 0, "false", "false"); 
    mDbHelper.deleteNote(3); 
    Cursor c = mDbHelper.fetchNote(3);

Вот мой LogCat:

FATAL EXCEPTION: main
android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
at com.real.AlgebraActivity$1.onClick(AlgebraActivity.java:301)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9080)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

Как всегда, спасибо за любую помощь.

1 Ответ

3 голосов
/ 21 февраля 2012

Хорошо, я думаю, что нашел корень вашего Exception.В методе действия onClick() вы создаете (и вставляете в БД) 4 примечания, удаляете одно (примечание 3) и затем извлекаете примечание 3 (это должно быть примечание 4, которое стало примечанием 3).То, что вы не опубликовали в этом методе, - это другие строки после строки Cursor c = mDbHelper.fetchNote(3);, где, скорее всего, вы пытаетесь использовать этот курсор c.

Проблема в том, что ваш *Метод 1009 * работает так, как вы его спроектировали:
- удаляет заметку с идентификатором (в вашем примере 3)
- x=3 и y становится 3 (вы удалили одну строку из 4, которые вы вставили) поэтому, когда вы попадаете в цикл while (x < y), условие ложно, поэтому вы никогда не входите в цикл, чтобы обновить примечание 4, чтобы оно стало примечанием 3. Теперь ваша база данных имеет такую ​​структуру:

note 1
note 2
note 4

Затем вы пытаетесь получить заметку 3, которая не существует, и в итоге вы получаете пустой курсор c, над которым вы пытаетесь работать, и выдает CursorIndexOutOfBoundsException.

Чтобы решить проблему, попробуйте обновить логику, чтобы в столбце KEY_REALROWID не было пустых мест.(Я не проверял, но пытаюсь вставить while(x <= y) в метод deleteNote()).
Ну, это то, что я думаю, что это происходит.

...