Подтвердить что ты не робот

Android: Sugar ORM Нет такого исключения таблицы

Я получаю исключение No Such table, когда я использую Sugar ORM с графическим файлом Android для Android, Я использую 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)
4b9b3361

Ответ 1

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

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

Ответ 2

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

Имея такую ​​же проблему!

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

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

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

Ответ 3

Я столкнулся с той же проблемой. Отключение "Instant run" не решило проблему. Я тоже не включил 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" /> 

EDIT: Согласно комментарию jrhamza, если выше решение не работает, попробуйте отключить Instant Run.

Ответ 4

Я использую версию 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();
    }
}

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

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

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

Ответ 9

Решенный

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

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

Ответ 10

У меня также была эта проблема, у моего класса было только 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

Ответ 11

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

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;
   }
}

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

Ответ 12

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

введите описание изображения здесь

Ответ 13

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

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

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

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

Ответ 14

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

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

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

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

Ответ 15

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

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.

Ответ 16

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

Ответ 17

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

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

to

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

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

Ответ 18

Для меня проблема: в моем приложении у меня было две разные базы данных. поэтому я изменил только с версии 1 на версию 2. У моей первой БД была версия 1

Ответ 19

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

Чтобы сделать это, добавьте эту строку в proguard-rules.pro:

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

Ответ 20

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