Я работаю над уточнением базы данных, которую я написал для своего приложения некоторое время назад. Предыдущая база данных работала нормально, но была просто грязной, и я сделал глупость, попробовал почистить ее. Это вызвало странную, менее полезную ошибку, которую я не могу расшифровать. После долгих поисков и, наконец, возвращения к базе данных, насколько я могу судить, идентичной моей предыдущей БД, я все еще получаю проклятую ошибку.
Ошибка:
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()
) и похоже, что проблема в том, что в таблице нет данных. Если бы это было так, я должен получить нулевой возврат курсора, не так ли? Или я неверно истолковываю то, что читаю, и на самом деле написано, что таблица не найдена?