Android: Sugar ORM - нет такого исключения стола

Я получаю No Such table исключение, когда я использую Sugar ORM с изображением графического процессора Android Library. Я использую Gradle и Android Studio. Как только я удаляю изображение GPU, эта проблема решена Так что я не знаю, что вызвало это исключение. Подробности об этом исключении также обсуждаются в этой проблеме git, и многие люди все еще сталкиваются с этим.

Мой журнал аварий опубликован ниже

> 10-09 11:30:21.511 4326-4831/com.example.app E/SQLiteLog: (10) Failed
> to do file read, got: 0, amt: 100, last Errno: 2 10-09 11:30:26.506
> 4326-4831/com.example.app E/SQLiteLog: (1) no such table: IMAGE 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: FATAL
> EXCEPTION: AsyncTask #1 10-09 11:30:26.516 4326-4831/com.example.app
> E/AndroidRuntime: java.lang.RuntimeException: An error occured while
> executing doInBackground() 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> android.os.AsyncTask$3.done(AsyncTask.java:299) 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.setException(FutureTask.java:219)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.run(FutureTask.java:239) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.lang.Thread.run(Thread.java:838) 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:  Caused by:
> android.database.sqlite.SQLiteException: no such table: IMAGE (code
> 1): , while compiling: SELECT * FROM IMAGE 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native
> Method) 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:
> at
> android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1238)

20 ответов

У меня была такая же проблема, она связана с Instant Run. Отключите мгновенный запуск, переустановите приложение, и оно работает.

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

Если вы используете Android Studio 2.0

Имея ту же проблему!

Так что мгновенный запуск не совместим с Sugar ORM

  • открытая настройка
  • Теперь запустите свой проект

Наслаждайтесь!

Я столкнулся с той же проблемой. Отключение "Мгновенного запуска" не решило проблему. Я не включил Proguard тоже. Позже я удалил все метаданные sugarORM из манифеста Android (кроме журнала запросов), и это решило проблему. Удалите следующие 3 строки из манифеста Android:

    <meta-data android:name="DATABASE" android:value="edikodik.db" />
    <meta-data android:name="VERSION" android:value="2" />
    <meta-data android:name="QUERY_LOG" android:value="true" /> 

РЕДАКТИРОВАТЬ: Согласно комментарию jrhamza, если вышеуказанное решение не работает, попробуйте отключить Instant Run.

Я использую версию 1.5 и пробовал много способов здесь, но не работает.

И я нашел решение!

Это заставит создавать таблицы при запуске приложения:

public class SugarOrmTestApplication extends SugarApp {
    @Override
    public void onCreate() {
        super.onCreate();
        SugarContext.init(getApplicationContext());

        // create table if not exists
        SchemaGenerator schemaGenerator = new SchemaGenerator(this);
        schemaGenerator.createDatabase(new SugarDb(this).getDB());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        SugarContext.terminate();
    }
}

Если вы добавляете новую модель (новую таблицу) в свой код, вам нужно изменить версию базы данных в файле манифеста. Новое значение> Старое значение (обновление)

 <meta-data
            android:name="VERSION"
            android:value="1"/>

Я также столкнулся с этой проблемой. После охоты 2 дня я решил это, следуя трюкам в андроид студии

Шаг 1. Напишите компиляцию 'com.github.satyan:sugar:1.5' в зависимости в файле build.gradle приложения

Шаг 2. Запишите classpath 'com.android.tools.build:gradle:2.1.0' в зависимости от файла build.gradle проекта

Шаг 3. Версия БД всегда должна быть больше 1, как указано в sugarORM

Чтобы отключить мгновенный запуск, выберите "Файл"> "Настройки"> "Построение, выполнение, развертывание"> "Быстрый запуск".

Постановили

Я не знаю, но SugarDb.onCreate не вызывается. Так что поместите этот код в MainActivity.onCreate и Sugar ORM будет работать

    SugarDb db = new SugarDb(this);
    db.onCreate(db.getDB());

В моем случае я удалил следующую строку из AndroidManifest.xml, и она работает!

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

Book.findById(Book.class, (long) 1);
Car.findById(Car.class, (long) 1);

Мое приложение расширяет SugarApp, поэтому это заставляет Sugar создавать все таблицы.

С другой стороны, чтобы обновить базу данных, вам нужно изменить версию на 2.

И наконец, наличие пустого конструктора является обязательным.

Надеюсь это поможет!;)

У меня также была эта проблема, у моего класса было только 1 свойство String. Я использовал версию 1.3. Просто закомментируйте этот код из файла AndroidManifest.xml и готово!

<meta-data
 android:name="DOMAIN_PACKAGE_NAME"
 android:value="com.project.database.entities" />

Ссылка:

https://github.com/satyan/sugar/issues/75

У меня была эта проблема. Я выполнил все предложения, размещенные здесь. Но ни один не работал. Затем я применил все вместе и, наконец, избавился от этой проблемы. Что я сделал-

1. Disabled instant run. (as Parth Vora said.)
2. Then I added the following class-

   import android.app.Application;
   import android.content.res.Configuration;
   import com.orm.SugarApp;
   import com.orm.SugarContext;

   public class SugarOrmTestApplication extends SugarApp {

      @Override
      public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
      }

      @Override
     public void onCreate() {
        super.onCreate();
        SugarContext.init(getApplicationContext());
        Book.findById(Book.class, (long) 1);
     }

     @Override
     public void onLowMemory() {
       super.onLowMemory();
     }

     @Override
     public void onTerminate() {
       super.onTerminate();
     }
 }

 3. Modified manifest file-
    <application
      //Added the following lines-
       android:name="SugarOrmTestApplication">
       <meta-data android:name="DATABASE" android:value="sugar_example_new.db" />
       <meta-data android:name="VERSION" android:value="2" />
       <meta-data android:name="QUERY_LOG" android:value="true" />
    </application>

И это мой модельный класс-

public class Book extends SugarRecord {
   String title;
   String edition;

   public Book(){
   }

   public Book(String title, String edition){
      this.title = title;
      this.edition = edition;
   }
}

Теперь мое приложение работает хорошо.

У меня была та же проблема, и я решил ее не отключив мгновенный запуск, а изменив:

<meta-data android:name="VERSION" android:value="1" />

в

<meta-data android:name="VERSION" android:value="2" />

Поскольку самое низкое значение должно быть 2

Как уже упоминалось, проблема может быть в мгновенном запуске Android Studio ( известная проблема SugarORM), попробуйте отключить его.

Однако у меня была та же проблема, и этого было недостаточно для меня, проблема сохранялась. Я исправил это, изменив allowBackup="true" в моем манифесте false, запустив приложение, и удалите> переустановите приложение впоследствии.

Почему я думаю, что это проблема: я обнаружил, что мои настройки сохранялись даже после переустановки. Если это также происходит с поврежденной таблицей SQL (из-за мгновенного запуска), то даже переустановка не исправит это. Моя проблема была сразу исправлена ​​после изменения параметра allowBackup на false и повторной установки. Я пока не могу воспроизвести ошибку, поэтому не могу воспроизвести и исправление.

Надеюсь, что это дополнение может помочь любому от головной боли, как я!

Вы пытались изменить версию на 2??? Это может быть другая версия, попробуйте и другие значения.

Также убедитесь, что у вас есть пустой конструктор в ваших классах SugarRecord.

Измените имя базы данных, если вы используете, то это еще одно приложение.

Если вы создаете таблицу без удаления приложения, сделайте номер версии +1.

Когда вы начинаете начальную разработку и не хотите увеличивать версию базы данных для изменений, внесенных во время быстрых итераций ваших моделей (что я часто делаю, пока выполняю непредвиденные требования), используйте это во время запуска ваших приложений -до:

SugarDb sugarDb = new SugarDb(getApplicationContext());
new File(sugarDb.getDB().getPath()).delete();
Model.findById(Model.class, (long) 1); // Perform this for each SugarRecord  model

// Insert test data:
Modelrecord = new Model("Model Title", "Model content", false);
record.save();

Будьте осторожны - это удалит все данные из вашей базы данных, поэтому постоянные изменения между сеансами отладки не будут работать, однако это позволит вам выпустить версию 1 вашего приложения версии 1 вашей базы данных.

Я не рекомендую делать это после официальной версии 1, убедитесь, что вы регистрируете ВСЕ изменения, необходимые с помощью метода миграции SugarORM.

Для меня проблема заключалась в том, что в моем приложении было две разные базы данных. Итак, я только изменил с версии 1 на версию 2. Моя первая БД была версия 1

Убедитесь, что имя пакета метаданных указывает на то, куда вы поместили объекты модели, а не на имя пакета приложения.

Пожалуйста, проверьте эту недвижимость

    <`meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="trending.hashtags.pojo" />`

Это должно быть именно там, где ваш класс POJO не только имя пакета.

Как указано в README из репозитория github, если вы используете proguard, вы должны убедиться, что сущности остаются не скрытыми, чтобы таблицы и столбцы были названы правильно.

Для этого добавьте эту строку в proguard-rules.pro:

-keep class com.yourpackage.yourapp.domainclasspackage.** { *; }

В моем случае это проблема библиотеки Sugar. У него плохой метод получения доменных классов (com.orm.util.ReflectionUtil#getDomainClasses). Метод всегда не возвращает классов. Поэтому Sugar не может инициализировать таблицы базы данных. Я опустился до версии 1.3.0 (этот метод работает правильно), и проблема исчезла.

Другие вопросы по тегам