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());
Чтобы создать таблицы моделей, я использую это для всех моих моделей после запуска приложения:
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" />
Ссылка:
У меня была эта проблема. Я выполнил все предложения, размещенные здесь. Но ни один не работал. Затем я применил все вместе и, наконец, избавился от этой проблемы. Что я сделал-
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 (этот метод работает правильно), и проблема исчезла.