2017-08-09 36 views
3

我想我的手在使用Android Room及以下this tutorial后,我收到以下错误,当我尝试构建应用程序:安卓房SQLite_ERROR没有这样的表

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

名称是精应该存在。完成我的更改后,我清理了该项目并确保它完全从设备上卸载。

在我Activity我这一行初始化的东西在onCreate

db = AppDatabase.getDatabase(getApplicationContext()); 

这里是我的代码:

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

为什么'SQLiteHandler'存在?你的房间实体在哪里定义'screen_items'? 'AppDatabase'和'SQLiteHandler'都试图使用同一个数据库文件吗? – CommonsWare

+0

那么它并没有在教程中没有,但我认为我可能需要它来创建表格(S) – jampez77

+0

Room创建表格,作为设置和使用' AppDatabase'。你试图访问'screen_items'的代码在哪里? – CommonsWare

回答

10

间名表一样有联系实体。在您的DAO中,TABLE_ITEMS需要为PermitItem,因为您的实体是PermitItem。或者,将tableName属性添加到@Entity注释中,以告知Room用于该表的其他名称。

+0

谢谢!这现在工作得很好..我也有我的主键设置为'int',但只有'长'工作 – jampez77

+0

非常感谢您指的tableName属性 –

1

另一个原因错误可能是企业未在AppDatabase.java文件中列出:

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

请确保您有在数据库文件夹中的最新的数据库文件,如果您导出模式,确保app \ schemas下的.json模式文件正在正确更新。