jampez77
jampez77

Reputation: 5231

Android Room SQLite_ERROR no such table

I'm trying my hand at using Android Room and after following this tutorial I'm getting the following error when i try to build the app:

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

The name is fine and should exist. After making my changes I cleaned the project and made sure it was completely uninstalled from the device.

In my Activity I'm initialising the things in onCreate with this line:

db = AppDatabase.getDatabase(getApplicationContext());

Here is my 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();
}

Upvotes: 75

Views: 40172

Answers (7)

Michael Python_dev
Michael Python_dev

Reputation: 51

In my case it was because of not adding the entity class to entities on the Database decorator on the Database file

Upvotes: 1

Sana Ebadi
Sana Ebadi

Reputation: 7210

my problem was with TABLE NAME :||| I wrote my table name In the wrong word :(((

Upvotes: 1

It helped me a lot to see the articles. I had this errorDatabase(entities = {Folder.class}, version = 1, exportSchema = false)

just add my other class @Database(entities = {Folder.class, Urls.class}, version = 1, exportSchema = false)

Upvotes: 15

ralphgabb
ralphgabb

Reputation: 10528

If you just added a new table, just update your Database class (That one class extending the RoomDatabase() class) and update the entities annotation

@Database(entities = [User::class, NewTableHere::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

Wish it saves you time on searching for answer, happy coding.

Upvotes: 17

Taslim Oseni
Taslim Oseni

Reputation: 6263

In my case, the cause of the problem was using the wrong table name. The table name I chose for my model class was different from the class name. I erroneously used the class name while querying my Data-Access-Object interface.

@Query("SELECT * FROM tablename")

Check your table name to make sure they match with the table name annotated into the model class.

I hope this helps. Merry coding!

Upvotes: 2

live-love
live-love

Reputation: 52366

Another reason for this error could be the entity is not listed in the AppDatabase.java file:

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

Make sure you have the latest db file in the databases folder, and if you export your schema, make sure your .json schema file under app\schemas is being properly updated.

Upvotes: 222

CommonsWare
CommonsWare

Reputation: 1006549

Room names tables the same as their associated entities. In your DAO, TABLE_ITEMS needs to be PermitItem, because your entity is PermitItem. Or, add the tableName property to the @Entity annotation, to tell Room some other name to use for the table.

Upvotes: 50

Related Questions