2017-08-09 3 views
3

J'essaie ma main à l'aide Android Room et après avoir suivi this tutorial je reçois l'erreur suivante lorsque je tente de construire l'application:Chambre Android SQLite_ERROR pas de tableau

Error:(23, 27) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: screen_items)

Le nom est bien et devrait exister. Après avoir apporté mes modifications, j'ai nettoyé le projet et vérifié qu'il était complètement désinstallé de l'appareil.

Dans mon Activity je les initialisant choses onCreate avec cette ligne:

db = AppDatabase.getDatabase(getApplicationContext()); 

Voici mon code:

AppDatabase

@Database(entities = {PermitItem.class}, version = 1, exportSchema = false) 
public abstract class AppDatabase extends RoomDatabase { 
    public static String DATABASE_NAME = "my_database"; 
    public final static String TABLE_ITEMS = "screen_items"; 

    private static AppDatabase INSTANCE; 

    public abstract PermitItemDao permitItemModel(); 

    public static AppDatabase getDatabase(Context context) { 
    if (INSTANCE == null) { 
     INSTANCE = Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME).allowMainThreadQueries().build(); 
    } 
    return INSTANCE; 
    } 

    public static void destroyInstance() { 
    INSTANCE = null; 
    } 
} 

PermitItem

@Entity 
public class PermitItem { 
    @PrimaryKey(autoGenerate = true) 
    public final int id; 
    private String posX, posY, width, height, content, type; 

    public PermitItem(int id, String posX, String posY, String width, String height, String content, String type) { 
    this.id = id; 
    this.posX = posX; 
    this.posY = posY; 
    this.width = width; 
    this.height = height; 
    this.content = content; 
    this.type = type; 
    } 

    public static PermitItemBuilder builder(){ 
    return new PermitItemBuilder(); 
    } 

    public static class PermitItemBuilder{ 
    int id; 
    String posX, posY, width, height, content, type; 


    public PermitItemBuilder setId(int id) { 
     this.id = id; 
     return this; 
    } 


    public PermitItemBuilder setPosX(String posX) { 
     this.posX = posX; 
     return this; 
    } 


    public PermitItemBuilder setPosY(String posY) { 
     this.posY = posY; 
     return this; 
    } 


    public PermitItemBuilder setWidth(String width) { 
     this.width = width; 
     return this; 
    } 


    public PermitItemBuilder setHeight(String height) { 
     this.height = height; 
     return this; 
    } 


    public PermitItemBuilder setContent(String content) { 
     this.content = content; 
     return this; 
    } 


    public PermitItemBuilder setType(String type) { 
     this.type = type; 
     return this; 
    } 

    public PermitItem build() { 
     return new PermitItem(id, posX, posY, width, height, content, type); 
    } 
    } 

    public long getId() { 
    return id; 
    } 

    public String getPosX() { 
    return posX; 
    } 

    public void setPosX(String posX) { 
    this.posX = posX; 
    } 

    public String getPosY() { 
    return posY; 
    } 

    public void setPosY(String posY) { 
    this.posY = posY; 
    } 

    public String getWidth() { 
    return width; 
    } 

    public void setWidth(String width) { 
    this.width = width; 
    } 

    public String getHeight() { 
    return height; 
    } 

    public void setHeight(String height) { 
    this.height = height; 
    } 

    public String getContent() { 
    return content; 
    } 

    public void setContent(String content) { 
    this.content = content; 
    } 

    public String getType() { 
    return type; 
    } 

    public void setType(String type) { 
    this.type = type; 
    } 

    @Override 
    public String toString() { 
    return "PermitItem{" + 
      "id=" + id + 
      ", posX='" + posX + '\'' + 
      ", posY='" + posY + '\'' + 
      ", width='" + width + '\'' + 
      ", height='" + height + '\'' + 
      ", content='" + content + '\'' + 
      ", type='" + type + '\'' + 
      '}'; 
    } 


} 

PermitItemDao

@Dao 
public interface PermitItemDao { 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    long addPermitItem(PermitItem permitItem); 

    @Query("select * from " + TABLE_ITEMS) 
    ArrayList<PermitItem> getAllPermitItems(); 

    @Query("select * from " + TABLE_ITEMS + " where id = :id") 
    PermitItem getPermitItemById(int id); 

    @Update(onConflict = OnConflictStrategy.REPLACE) 
    void updatePermitItem(PermitItem permitItem); 

    @Query("delete from " + TABLE_ITEMS) 
    void removeAllPermitItems(); 
} 
+1

Pourquoi 'SQLiteHandler' existe-t-il? Où est votre entité Room qui définit 'screen_items'? Sont à la fois 'AppDatabase' et' SQLiteHandler' essayant de travailler avec le même fichier de base de données? – CommonsWare

+0

Eh bien, il n'y en avait pas car il n'y en avait pas dans le tutoriel mais je l'ai remis en pensant que j'en aurais besoin pour créer la ou les tables – jampez77

+0

Room crée les tables, dans le cadre de la configuration et de l'utilisation ' AppDatabase'. Où est votre code qui tente d'accéder à 'screen_items'? – CommonsWare

Répondre

10

tables noms de chambre les mêmes que leurs entités associées. Dans votre DAO, TABLE_ITEMS doit être PermitItem, car votre entité est PermitItem. Ou, ajoutez la propriété tableName à l'annotation @Entity pour indiquer à Room un autre nom à utiliser pour la table.

+0

Merci! Cela fonctionne bien maintenant .. J'avais aussi ma clé primaire définie comme 'int' mais seulement' long' fonctionne – jampez77

+0

Merci beaucoup de faire référence à la propriété tableName –

1

Une autre raison de cette erreur pourrait être l'entité ne figure pas dans le fichier AppDatabase.java:

@Database(entities = {XEntity.class, YEntity.class, ZEntity.class}, 
version = 1, exportSchema = true) 

Assurez-vous que vous avez le dernier fichier db dans le dossier des bases de données, et si vous exportez votre schéma, assurez-vous que votre fichier de schéma .json sous app \ schemas est correctement mis à jour.