2015-07-15 2 views
4

Я использую следующий 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(), но проблема сохраняется.

+0

Не могли бы вы показать свой класс 'Account'? –

+0

@EdGeorge См. Редактирование. – FWeigl

+0

Конечно, вы удалили приложение и снова установили его (или удалили db, чтобы быть уверенным, что хотя бы один раз onCreate (этот вызов - не предыдущий без fx: 'TableUtils.createTable (..)' call) был вызван) ? также вы уверены, что прогард не обфускал это имя? – Selvin

ответ

2

Из того, что я вижу, вам не хватает аннотации @DatabaseTable на вашем классе Account.

Из docs:

Аннотация, отмечающий класс будет храниться в базе данных. [...] Вы указываете эту аннотацию выше классов, которые вы хотите сохранить в базе данных.

Ниже следует создать таблицу account:

@DatabaseTable 
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; 

} 

Вы можете изменить имя таблицы с помощью tableName поля в аннотации, например, @DatabaseTable(tableName = "accounts") В противном случае состояние документов:

Если значение не задано, то имя берется из имени класса с нижним регистром.

+0

Документы также указывают: «Это требуется только в том случае, если вы хотите пометить класс или изменить его значение по умолчанию». Я действительно не знаю, что означает «отметить класс», но я полагаю, что аннотация не требуется для создания таблицы. Я попробую это, хотя. – FWeigl

-2

Добавить имя таблицы, чтобы обеспечить создание. @DatabaseTable (tableName = "account")

+2

Почему вы повторяете то, что уже было опубликовано и обсуждено? – FWeigl

Смежные вопросы