Кто-нибудь знает, что такое исключение Invalid Table? - PullRequest
1 голос
/ 02 марта 2011

Я работаю над уточнением базы данных, которую я написал для своего приложения некоторое время назад. Предыдущая база данных работала нормально, но была просто грязной, и я сделал глупость, попробовал почистить ее. Это вызвало странную, менее полезную ошибку, которую я не могу расшифровать. После долгих поисков и, наконец, возвращения к базе данных, насколько я могу судить, идентичной моей предыдущей БД, я все еще получаю проклятую ошибку.

Ошибка:

03-02 10:38:30.205: ERROR/AndroidRuntime(505): FATAL EXCEPTION: JobLister: RunThread jobs
03-02 10:38:30.205: ERROR/AndroidRuntime(505): java.lang.IllegalStateException: Invalid tables
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at android.database.sqlite.SQLiteDatabase.findEditTable(SQLiteDatabase.java:1313)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1414)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1370)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1450)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.database.Database.getRecord(Database.java:120)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.database.Database.getRecord(Database.java:107)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.database.Database.getRecord(Database.java:97)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.activities.JobLister.getJobs(JobLister.java:69)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.activities.JobLister.access$3(JobLister.java:66)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at com.android.appion.arm.activities.JobLister$2.run(JobLister.java:52)
03-02 10:38:30.205: ERROR/AndroidRuntime(505):     at java.lang.Thread.run(Thread.java:1020)

Поэтому, естественно, я следил за трассировкой пилы и увидел, что она возникла из-за вызова, который я выполняю в одном из своих действий, к базе данных, которую я сохранил в своем сервисе (естественно).

База данных вызова из операции:

Cursor c = mService.getDatabase().getRecord(new Table.Jobs());

Все это кажется правильным. Используя сервис, я получаю базу данных, а вместе с базой данных получаю все записи из заданий таблицы.

Шаговый метод getRecord и определение таблицы Джобса:

public Cursor getRecord(DataTable table) {
    return getRecord(table, null);
}

public Cursor getRecord(DataTable table, String[] columns) {
    return getRecord(table, columns, null);
}

/**
 * Return a Cursor with every item in which data is only coming from columns,
 * and the records satisfies all selection requirements.
 * @param table The table to query.
 * @param columns The columns to retieve data.
 * @param selection The requirements to base the data collection on. (WHERE statement
 * without WHERE).
 * @return The Cursor full of queried items.
 */
public Cursor getRecord(DataTable table, String[] columns, String selection) {
    return mDB.query(table.TITLE, (columns == null) ? new String[] {"*"} : columns,
        selection, null, null, null, null);
}

и таблица:

public static class Jobs extends DataTable {
    public static final String TITLE = "jobs";
    public static final String[] FIELD = {"job_id",
                                        "job_name", // User given name
                                            "job_contact", // client
                                            "job_location", // The location of the job
                                            "job_notes",
                                            "job_summary", // The byte object of a JobSummary
                                            "wkb_name", // the workbench that is being used for the job
                                            "job_startdate",
                                            "job_enddate"}; 
        public Jobs() { super(); }      
        public String getTable() {
            return "create table " + TITLE +
                "(" + FIELD[0] + " integer primary key autoincrement, " +
                FIELD[1] + " text, " +
                FIELD[2] + " blob, " +
                FIELD[3] + " blob, " +
                FIELD[4] + " text, " +
                FIELD[5] + " blob, " +
                FIELD[6] + " blob, " +
                FIELD[7] + " text, " +
                FIELD[8] + " text " +
                ");";
        }
    }

Теперь этот стиль проектирования отлично работал с моей последней базой данных и теперь дословно минус тот факт, что таблица заданий расширяет DataTable для простоты первоначального создания базы данных благодаря абстракции.

Может кто-нибудь увидеть что-то не так с этим?

EDIT ::

Я прочитал источник ошибки (SQLiteDatabase.findEditTable()) и похоже, что проблема в том, что в таблице нет данных. Если бы это было так, я должен получить нулевой возврат курсора, не так ли? Или я неверно истолковываю то, что читаю, и на самом деле написано, что таблица не найдена?

1 Ответ

0 голосов
/ 02 марта 2011

Хорошо, я узнал, что случилось.Исключение «Недопустимые таблицы» скрывает ошибку о том, что база данных была создана правильно.Мое плохое: P

EDIT :: Это была проблема с абстракцией.Так как я расширился от DataTables, но вызывал переменную статически, он никогда не инициализировался должным образом.Урок: не используйте абстрактные классы для таблиц.Помимо того, что это очень уродливо, это не работает так же хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...