web-dev-qa-db-fra.com

Android Room SQLite_ERROR no such table

J'essaie d'utiliser Android Room et après avoir suivi ce tutoriel J'obtiens l'erreur suivante lorsque j'essaie de créer l'application:

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 je me suis assuré qu'il était complètement désinstallé de l'appareil.

Dans mon Activity j'initialise les choses dans 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();
}
20
jampez77

Les tables de noms de salle sont identiques à leurs entités associées. Dans votre DAO, TABLE_ITEMS doit être PermitItem, car votre entité est PermitItem. Ou, ajoutez la propriété tableName à la @Entity annotation, pour indiquer à Room un autre nom à utiliser pour la table.

23
CommonsWare

Une autre raison de cette erreur pourrait être que l'entité n'est pas répertoriée dans le fichier AppDatabase.Java:

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

Assurez-vous que le dernier fichier db se trouve 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.

65
live-love

Dans mon cas, la cause du problème était en utilisant le mauvais nom de table. Le nom de table que j'ai choisi pour ma classe de modèle était différent du nom de classe. J'ai utilisé par erreur le nom de classe lors de la requête sur mon interface Data-Access-Object.

@Query("SELECT * FROM tablename")

Vérifiez le nom de votre table pour vous assurer qu'il correspond au nom de la table annoté dans la classe de modèle.

J'espère que ça aide. Joyeux codage!

0
Taslim Oseni