web-dev-qa-db-fra.com

Android: Sugar ORM Pas d'exception de table

Je reçois le No Such table exception lorsque je me sers de Sugar ORM avec image GPU Android Bibliothèque . J'utilise Gradle et Android Studio. Une fois que je supprime l’image GPU, ce problème est résolu. Je ne sais donc pas ce qui est à l’origine de cette exception. Des détails sur cette exception sont également abordés dans ce problème de git et cela semble beaucoup. des gens y font toujours face.

Mon journal d'accident est affiché ci-dessous

> 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)
37

J'ai eu le même problème, il est lié à Instant Run. Désactivez l'exécution instantanée, réinstallez l'application et tout fonctionne.

Voir ce lien pour plus de détails sur l'activation ou la désactivation de l'exécution instantanée.

96
Michele

Si vous utilisez Android studio 2.0

Avoir le même problème!

Donc, l'exécution instantanée n'est pas compatible avec Sugar ORM

  • cadre ouvert
  • enter image description here
  • maintenant lancez votre projet

Prendre plaisir!

67
Parth Vora

Je faisais face au même problème. La désactivation de l'exécution instantanée n'a pas résolu le problème. Je n'ai pas activé proguard aussi. Plus tard, j'ai supprimé toutes les métadonnées de sugarORM de Android manifest (à l'exception du journal des requêtes)), ce qui a résolu le problème. Supprimez donc les 3 lignes suivantes de Android manifest:

    <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: Selon le commentaire de jrhamza, si la solution ci-dessus ne fonctionne pas, essayez de désactiver Instant Run.

30
farhad rubel

J'utilise la version 1.5 et ai essayé de nombreuses façons ici mais ne fonctionne pas.

Et j'ai trouvé la solution!

Cela obligera à créer des tables lors du démarrage de l'application:

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();
    }
}
16
YK Leung

Si vous ajoutez un nouveau modèle (nouvelle table) dans votre code, vous devez modifier la version de la base de données dans le fichier Manifest. Nouvelle valeur> Ancienne valeur (mise à jour)

 <meta-data
            Android:name="VERSION"
            Android:value="1"/>
14
hoangdv

J'ai aussi fait face à ce problème. Après avoir chassé 2 jours, je l'ai résolu en suivant les astuces dans Android studio

Étape 1. Écrivez compilez 'com.github.satyan: sugar: 1.5' dans les dépendances dans le fichier build.gradle de l'application

Étape 2. Écrivez classpath 'com.Android.tools.build:gradle:2.1.0' dans les dépendances du fichier build.gradle du projet

Étape 3. La version de la base de données doit être supérieure à 1, comme indiqué dans sugarORM.

10
Sachin Tyagi

Pour désactiver votre exécution instantanée, sélectionnez Fichier> Paramètres> Construction, Exécution, Déploiement> Exécution instantanée.

8
user8919158

Résolu

Je ne sais pas, mais SugarDb.onCreate n'est pas appelé. Alors mettez ce code dans MainActivity.onCreate et le sucre ORM fonctionnera

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

Pour créer des tables de modèle, j'exécute cette opération pour tous mes modèles une fois l'application lancée:

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

Mon application étend SugarApp, ce qui oblige Sugar à créer toutes les tables.

Par contre, pour mettre à jour votre base de données, vous devez changer votre version en 2.

Et enfin, avoir un constructeur vide est un must.

J'espère que cela t'aides! ;)

6
NewUser

Dans mon cas, j'ai supprimé la ligne suivante de AndroidManifest.xml et cela fonctionne!

enter image description here

5
W.Dan

J'ai eu ce problème. J'ai exécuté toutes les suggestions affichées ici. Mais ni a travaillé. Ensuite, j'ai postulé tous ensemble et je me suis finalement débarrassé de ce problème. Ce que j'ai fait-

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>

Et c'est ma classe de modèle-

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

   public Book(){
   }

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

Maintenant, mon application fonctionne bien.

4
s.k.paul

J'avais aussi ce problème, ma classe n'avait qu'une propriété String. J'utilisais la version 1.3. Commentez ce code à partir du fichier AndroidManifest.xml et le tour est joué :)

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

Référence:

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

4
Husyn

Avez-vous essayé de changer de version à 2 ??? Cela pourrait être une version différente, essayez également d'autres valeurs.

Assurez-vous également que le constructeur est vide sur vos classes SugarRecord.

Changer le nom de la base de données si vous utilisez est un autre approuche.

Si vous créez la table sans désinstaller l'application, indiquez le numéro de version +1.

2
rdenadai

J'ai eu le même problème et je l'ai résolu non pas en désactivant l'exécution instantanée, mais en changeant mon:

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

à

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

Puisque la valeur la plus basse devrait être 2

2
gurehbgui

Comme mentionné par d'autres, Android Studio instantané peut être le problème ( problème connu de SugarORM )), essayez de le désactiver.

Cependant, j'ai eu le même problème, et cela ne me suffisait pas, le problème a persisté. J'ai corrigé cela en changeant allowBackup="true" dans mon manifeste à false, en exécutant l'application, puis supprimez-la, puis réinstallez-la.

Pourquoi je suppose que c'est le problème: j'ai découvert que mes préférences avaient été conservées même après la réinstallation. Si cela se produit également dans la table SQL corrompue (en raison d'une exécution instantanée), même une réinstallation ne résoudrait pas le problème. Mon problème a été immédiatement résolu après la modification de allowBackup en false et la réinstallation. Je ne suis pas encore capable de reproduire l'erreur, je ne peux donc pas reproduire le correctif non plus.

J'espère que cet ajout pourrait aider quelqu'un de maux de tête comme moi!

2
P Kuijpers

Pour moi, le problème était, dans mon application, j'avais deux bases de données différentes. alors, je n'ai changé que de la version 1 à la version 2. Mon premier DB avait la version 1

Assurez-vous que le nom du paquet de métadonnées pointe vers l'endroit où vous avez placé vos entités de modèle et non le nom du paquet d'application.

1
johncurtis32

Lorsque vous démarrez le développement initial et que vous ne souhaitez pas augmenter la version de votre base de données pour les modifications apportées lors de l'itération rapide de vos modèles (ce que je fais souvent pendant que je répète des exigences imprévues), utilisez-la lors du lancement de vos applications. -up:

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();

Soyez averti - Cela supprimera toutes les données de votre base de données. Ainsi, les modifications persistantes entre les sessions de débogage ne fonctionneront pas. Toutefois, cela vous permet de publier la version 1 de votre application version 1 de votre base de données.

Je ne recommande pas de faire cela après la publication officielle de la version 1, assurez-vous de consigner TOUTES les modifications nécessaires à l'aide de la méthode de migration SugarORM .

1
Tom 'Blue' Piddock

S'il vous plaît vérifier cette propriété

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

Cela devrait être exactement où votre classe POJO n'est pas uniquement le nom du paquet.

0
Rishabh Dugar

Comme indiqué dans le fichier README du dépôt github, si vous utilisez proguard, vous devez vous assurer que les entités ne sont pas obscurcies, ainsi les tables et les colonnes sont nommées correctement.

Pour ce faire, ajoutez cette ligne à proguard-rules.pro:

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

Dans mon cas, c'est le problème de la bibliothèque Sugar. Il a une mauvaise méthode pour obtenir des classes de domaine (com.orm.util.ReflectionUtil # getDomainClasses). La méthode ne renvoie toujours aucune classe. Donc, Sugar peut ne pas initialiser les tables de la base de données. J'ai rétrogradé à la version 1.3.0 (cette méthode fonctionne correctement) et le problème a disparu.

0
atott