Я использую следующий DatabaseHelper с OrmLite на Android:OrmLite SQLiteException: нет такой таблицы
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String TAG = "databaseHelper";
private static final String DATABASE_NAME = "mydb.db";
// Mind onUpgrade when changing this!
private static final int DATABASE_VERSION = 18;
private Dao<Account, Integer> accountDao;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Account.class);
} catch (SQLException e) {
ExceptionHandler.handleException(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
private Dao<Account, Integer> getAccountDao() {
if (accountDao == null) {
try {
accountDao = getDao(Account.class);
} catch (Exception exc) {
Log.e(TAG, exc.toString());
ExceptionHandler.handleException(exc);
}
}
return accountDao;
}
public void writeAccount(Account account) {
try {
TableUtils.createTableIfNotExists(connectionSource, IWAccount.class);
getAccountDao().createOrUpdate(account);
} catch (SQLException exc) {
Log.e(TAG, exc.toString());
ExceptionHandler.handleException(exc);
}
}
public void deleteIWAccount() {
try {
TableUtils.clearTable(connectionSource, Account.class);
} catch (SQLException e) {
Log.e(TAG, e.toString());
ExceptionHandler.handleException(e);
e.printStackTrace();
}
}
public Account getAccount() {
List<Account> accounts = null;
try {
accounts = getAccountDao().queryForAll();
} catch (SQLException e) {
e.printStackTrace();
ExceptionHandler.handleException(e);
}
if (accounts == null || accounts.isEmpty()) {
return null;
}
if (accounts.size() > 1) {
ExceptionHandler.handleException(new IllegalStateException("More than 1 IWAccounts in DB"));
}
return accounts.get(0);
}
}
Обработанные исключения написаны на Crittercism.
Для небольшого, но не neglectible числа пользователей происходит следующее исключение:
java.sql.SQLException: Problems executing Android query: SELECT * FROM `account`
at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
[...]
Caused by: android.database.sqlite.SQLiteException: no such table: account (code 1): , while compiling: SELECT * FROM `account`
Мой DatabaseHelper пытается создать таблицу для Account
в это onCreate()
метода.
Моя первая мысль заключалась в том, что что-то пошло не так, создавая таблицу в onCreate()
. Критерий, хотя позвольте мне просмотреть все другие обработанные или необработанные исключения для пользователей, где эта ошибка возникает, и ни у одного из них не было никаких исключений во время создания таблицы.
Любые идеи о том, что может быть проблемой здесь?
EDIT: Это упрощенная версия моего DatabaseHelper, такая же ошибка возникает и с другими Dao
s и таблицами. Классы, которые используются довольно просто, вот класс счета:
public class Account implements Serializable {
// id is set so we always update the old object instead of creating a new one in the db helper
@DatabaseField(id = true, canBeNull = false)
private int mid = 0;
@DatabaseField
private String id;
@DatabaseField
private String userName;
@DatabaseField
private String displayName;
}
EDIT2: Я сделал обновление для приложения с моими сохранялись классы с аннотацией @DatabaseTable
и воссоздающий (или пытается) таблицы в onUpgrade()
, но проблема сохраняется.
Не могли бы вы показать свой класс 'Account'? –
@EdGeorge См. Редактирование. – FWeigl
Конечно, вы удалили приложение и снова установили его (или удалили db, чтобы быть уверенным, что хотя бы один раз onCreate (этот вызов - не предыдущий без fx: 'TableUtils.createTable (..)' call) был вызван) ? также вы уверены, что прогард не обфускал это имя? – Selvin