2017-01-12 1 views
1

Je reçois l'erreur suivante pendant que je suis en train d'effectuer des opérations de CRUD sur mon db en utilisant sugarorm:ne pas recevoir une telle erreur de table avec Sugarorm 1.4 android

E/SQLiteLog: (1) no such table: CONTACT D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.sinha.abhishek.demoapp, PID: 2133 
       android.database.sqlite.SQLiteException: no such table: CONTACT (code 1): , while compiling: SELECT * FROM CONTACT WHERE id=? LIMIT 1 
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163) 
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034) 
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1240) 
        at com.orm.SugarRecord.find(SugarRecord.java:192) 
        at com.orm.SugarRecord.findById(SugarRecord.java:102) 
        at com.example.sinha.abhishek.demoapp.Contact.<init>(Contact.java:31) 
        at com.example.sinha.abhishek.demoapp.MainActivity$1.onClick(MainActivity.java:48) 
        at android.view.View.performClick(View.java:4785) 
        at android.view.View$PerformClick.run(View.java:19888) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5276) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 

Quelqu'un peut-il s'il vous plaît guider, ce qui pourrait être la probable cause pour cela et comment peut-il être réparé.

Ceci est ma classe POJO:

public class Contact extends SugarRecord{ 

    int contactid; 
    String firstName; 
    String lastName; 
    int age; 
    String address; 
    String phone; 

    public Contact(){ 
     super(); 
    } 

    public Contact(int contactid, String firstName, String lastName, int age, String address, String phone){ 
     this.contactid = contactid; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
     this.address = address; 
     this.phone= phone; 

    } 


} 

Ceci est mon fichier manifeste Android:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.sinha.abhishek.demoapp"> 

    <application 
     android:name="com.orm.SugarApp" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 



     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <meta-data 
      android:name="DATABASE" 
      android:value="hollywoodcontacts.db" /> 
     <meta-data 
      android:name="VERSION" 
      android:value="2" /> 
     <meta-data 
      android:name="QUERY_LOG" 
      android:value="true" /> 
     <meta-data 
      android:name="DOMAIN_PACKAGE_NAME" 
      android:value="com.example.sinha.abhishek.demoapp" /> 



    </application> 

</manifest> 

Ceci est mon exemple de code pour l'opération CRUD écrite dans l'activité principale:

Contact con = new Contact(101 ,"Abcd","Xyz",22,"myaddress", "9849848943"); 
con.save(); 

J'ai déjà essayé des options comme: 1. Désactivation de l'exécution instantanée 2. Contact.findById (Contact.class, (long) 1);

mais aucun n'a ensuite travaillé pour moi.

Directory structure of my project

+0

La cause est comme il est dit qu'il n'y a pas une table nommée ** CONTACT ** dans la base de données. Vous êtes également dit que l'erreur s'est produite lors de la compilation de l'instruction SELECT. Si vous avez codé ** CONTACT ** n'importe où, alors peut-être que cela devrait être ** Contact ** (les noms de tables sont sensibles à la casse comme le sont les noms de colonne). Ma conjecture est que la sélection fait partie de la vérification que le contact (selon l'ID) n'existe pas déjà. – MikeT

Répondre

1

Assurez-vous que vous avez correctement le nom du package de domaine. Il génère des tables jusqu'à ce paquet. Ce paquet doit avoir vos classes SugarRecord.

<meta-data 
     android:name="DOMAIN_PACKAGE_NAME" 
     android:value="com.example.sinha.abhishek.demoapp.(yourmodelpackage)" /> 

Lorsque vous avez mis à jour votre question, vos offres semblent bonnes. Le problème est que vous avez ajouté contactid à votre paquet qui est détecté comme champ personnalisé pour sugar orm. Parce que sugar orm a sa propre implémentation id et findById fonctionne dessus.

Veuillez mettre à jour votre classe comme ci-dessous;

public class Contact extends SugarRecord{ 

String firstName; 
String lastName; 
int age; 
String address; 
String phone; 

public Contact(){ 
    super(); 
} 

public Contact(long contactid, String firstName, String lastName, int age, String address, String phone){ 
    setId(contactid) 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.age = age; 
    this.address = address; 
    this.phone= phone; 
}} 

Et si vous souhaitez trouver une donnée jusqu'à un champ personnalisé, vous pouvez modifier un exemple donné. NamingHelper est critique ici parce que vos noms de champs sont différents des noms de colonnes.

CampaignDAO dao = CampaignDAO.find(CampaignDAO.class, NamingHelper.toSQLNameDefault("isPersonal") + " = ? ", "1").get(0); 
+0

J'ai ajouté la capture d'écran de la structure de répertoire de mon application, je suppose que le paquet est correct ou dois-je spécifier le nom de la classe aussi? –

+0

Après avoir fait les changements dans POJO comme suggéré par vous, je reçois toujours la même erreur. 'android.database.sqlite.SQLiteException: aucune table de ce type: CONTACT (code 1):, lors de la compilation: INSERT OU REPLACE IN CONTACT (ID, FIRST_NAME, AGE, ADDRESS, LAST_NAME, PHONE) VALEURS (?,?,?, ?,?,?) ' –

+0

Pouvez-vous essayer de faire une nouvelle installation? (Désinstallez et installez-le.) On dirait que vous avez une base de données de la version 2 mais que les requêtes de migration ont été complétées. Vous pouvez ajouter Contact SugarRecord plus tard? –

0

Ajout d'un constructeur par défaut devrait résoudre ce problème:

public class User 
{ 
    public User() { 
    } 
    .. 
} 
2

run instant Android Studio est peut-être le problème (known SugarORM issue), essayez de le désactiver (aide supplémentaire se trouve here).

Cependant, ces réponses ne m'ont pas aidé avec le même problème, et je suppose que cela ne vous aide pas non plus, parce que vous avez déclaré allowBackup="true" dans votre manifeste. Essayez de le définir sur false, exécutez votre application et supprimez-la> réinstallez-la. Pourquoi je suppose que c'est le problème: j'ai découvert que mes préférences ont été conservées même après la réinstallation. Si cela arrive aussi à la table SQL corrompue (en raison d'une exécution instantanée), même une réinstallation ne le résoudrait pas. Mon problème a été immédiatement résolu après avoir changé allowBackup à false et ré-installation.

Je ne suis pas encore en mesure de reproduire l'erreur, donc je ne peux pas reproduire le correctif non plus, mais c'est ma meilleure estimation. J'espère que ça vous aidera aussi!

+0

La meilleure réponse! –