【问题标题】:Android - No such table: Materia in existing tableAndroid - 没有这样的表:现有表中的材料
【发布时间】:2019-01-23 23:31:53
【问题描述】:

我有两张表 Materias(discipline) 和 Grade(grid)。 首先我从表Materias 调用活动并插入一些行,然后调用Grade 活动。它有一个来自Materias 的参考列,但是当我在内部加入这些表时,我得到了致命异常,说这个消息:

SQLiteException: no such table: Materias (code 1): , while compiling: SELECT g.*, c.Descricao FROM Grades g INNER JOIN Materias m ON  m.id = g.materia"

我的MateriaDAO

public class MateriaDAO extends SQLiteOpenHelper {

    public final String tabela = "Materias";

    public MateriaDAO(Context context) {
        super(context, "Materias", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String comando = "CREATE TABLE " + tabela + " (";
        comando += "id INTEGER PRIMARY KEY,";
        comando += "Descricao TEXT,";
        comando += "Comentario TEXT,";
        comando += "Qtd_Aulas INTEGER,";
        comando += "Qtd_Faltas INTEGER)";
        db.execSQL(comando);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + tabela;
        db.execSQL(sql);
        onCreate(db);
    }

    public void insert(Materia o) {    
        try{
            ContentValues cv = new ContentValues();
            cv.put("Descricao", o.getDescricao());
            cv.put("Comentario", o.getComentario());
            cv.put("Qtd_Aulas", o.getQtdAula());
            cv.put("Qtd_Faltas", o.getQtdAula());
            getWritableDatabase().insert(tabela, null, cv);
        } catch (Exception ex) {
            throw ex;
        }
    }

    public void update(Materia o) {
        ContentValues cv = new ContentValues();
        cv.put("Descricao", o.getDescricao());
        cv.put("Comentario", o.getComentario());
        cv.put("Qtd_Aulas", o.getQtdAula());
        cv.put("Qtd_Faltas", o.getQtdAula());
        String[] args = {o.getID() + ""};
        getWritableDatabase().update(tabela, cv, "ID=?", args);
    }

    public void delete(Materia o) {
        String[] args = {o.getID() + ""};
        getWritableDatabase().delete(tabela, "ID = ?", args);
    }

    public Materia preencher(Materia o) {
        String comando = "SELECT * FROM " + tabela + " WHERE ID " + o.getID();
        Cursor c = getReadableDatabase().rawQuery(comando, null);

        if(c.moveToFirst()) {
            Materia m = new Materia();
            m.setDescricao(c.getString(c.getColumnIndex("Descricao")));
            m.setComentario(c.getString(c.getColumnIndex("Comentario")));
            m.setQtdAula(Integer.parseInt(c.getString(c.getColumnIndex("Qtd_Aulas"))));
            m.setQtd_faltas(Integer.parseInt(c.getString(c.getColumnIndex("Qtd_Faltas"))));

            return m;
        } else {
            return  null;
        }
    }

    public List<Materia> listar() {
        String comando = "SELECT * FROM " + tabela;
        Cursor c = getReadableDatabase().rawQuery(comando, null);

        List<Materia> list = new ArrayList<>();
        Materia m;

        while(c.moveToNext()) {
            m = new Materia();
            m.setDescricao(c.getString(c.getColumnIndex("Descricao")));
            m.setComentario(c.getString(c.getColumnIndex("Comentario")));
            m.setQtdAula(Integer.parseInt(c.getString(c.getColumnIndex("Qtd_Aulas"))));
            m.setQtd_faltas(Integer.parseInt(c.getString(c.getColumnIndex("Qtd_Faltas"))));

            list.add(m);
        }

        return list;
    }

    public boolean checarTabelaVazia() {
        String comando = "SELECT * FROM " + tabela;
        Cursor c = getReadableDatabase().rawQuery(comando, null);
        return c.moveToFirst();
    }

    public void addFalta(Materia o) {
        String comando = "SELECT * FROM " + tabela + " WHERE ID " + o.getID();
        Cursor c = getReadableDatabase().rawQuery(comando, null);

        if (c.moveToFirst()) {
            int faltas = c.getInt(c.getColumnIndex("Qtd_Faltas"));
            faltas++;

            ContentValues cv = new ContentValues();
            cv.put("Qtd_Faltas", faltas);
            String[] args = {o.getID() + ""};
            getWritableDatabase().update(tabela, cv, "ID=?", args);
        }
    }
}

我的GradeDAO

public class GradeDAO extends SQLiteOpenHelper {
    private final String tabela = "Grades";

    Context context;

    public GradeDAO(Context context) {
        super(context, "Grades", null, 2); this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String comando = "CREATE TABLE " + tabela + " (";
        comando += "id INTEGER PRIMARY KEY,";
        comando += "Materia INTEGER,";
        comando += "Periodo TEXT,";
        comando += "Dia_Semana INTEGER)";

        db.execSQL(comando);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + tabela;
        db.execSQL(sql);
        onCreate(db);
    }

    public void insert(Grade o){

        try{
            ContentValues cv = new ContentValues();
            cv.put("Materia", o.getMateria());
            cv.put("Periodo", o.getPeriodo());
            cv.put("Dia_Semana", o.getDiaSemana());
            getWritableDatabase().insert(tabela, null, cv);
        }catch (Exception ex){

            throw ex;
        }
    }

    public void update(Grade o){
        ContentValues cv = new ContentValues();
        cv.put("Materia", o.getMateria());
        cv.put("Periodo", o.getPeriodo());
        cv.put("Dia_Semana", o.getDiaSemana());
        String[] args = {o.getID() + ""};
        getWritableDatabase().update(tabela, cv, "ID=?", args);
    }

    public void delete(Grade o){
        String[] args = {o.getID() + ""};
        getWritableDatabase().delete(tabela, "ID = ?", args);
    }

    public boolean checarTabelaVazia(){
        String comando = "SELECT * FROM " + tabela;
        Cursor c = getReadableDatabase().rawQuery(comando, null);
        return c.moveToFirst();
    }

    public Grade preencher(Grade gg){
        String comando = "SELECT g.*, c.Descricao FROM " + tabela + " g ";
        comando += " INNER JOIN Materia m ON  m.id = g.materia ";
        comando += " WHERE g.id = " + gg.getID();
        Cursor c = getReadableDatabase().rawQuery(comando, null);

        if(c.moveToFirst()){
            Grade o = new Grade();
            o.setID_Materia(c.getInt(c.getColumnIndex("Materia")));
            o.setMateria(c.getString(c.getColumnIndex("Descricao")));
            o.setPeriodo(c.getString(c.getColumnIndex("Periodo")));
            o.setDiaSemana(c.getInt(c.getColumnIndex("Dia_Semana")));

            return o;
        }
        else{
            return  null;
        }
    }

    public List<Grade> listar(){
        MateriaDAO dao = new MateriaDAO(context);
        List<Materia> m = dao.listar();

        String comando = "SELECT g.*, c.Descricao FROM " + tabela + " g ";
        comando += " JOIN " + dao.tabela + " m ON  m.id = g.materia ";
        Cursor c = getReadableDatabase().rawQuery(comando, null);

        List<Grade> list = new ArrayList<>();
        Grade o;

        while(c.moveToNext()){
            o = new Grade();
            o.setID_Materia(c.getInt(c.getColumnIndex("Materia")));
            o.setMateria(c.getString(c.getColumnIndex("Descricao")));
            o.setPeriodo(c.getString(c.getColumnIndex("Periodo")));
            o.setDiaSemana(c.getInt(c.getColumnIndex("Dia_Semana")));

            list.add(o);
        }

        return list;
    }
}

【问题讨论】:

  • 如果您有多个数据库,那么您必须附加到另一个才能使用连接(或创建临时表)。 即您的问题是 Materias 表在另一个未附加的数据库中,因此 GradeDao 不知道通过 MateriaDao 连接的 Materias 数据库中的 Materias 表。 您可能不需要多个数据库(一个数据库可以有多个表),因此是 SQLiteOpenHelper 的多个子类。

标签: java android database sqlite inner-join


【解决方案1】:

您的问题是有单独/不同的连接/数据库。也就是说,GradeDao 是一个连接/数据库,而 MateriaDao 是另一个。 他们相互独立,彼此一无所知。

因此GradeDao不知道MateriaDao中有一个名为Materias的表。

您可以将 Materias 数据库附加到 GradeDao 数据库SQL As Understood By SQLite - ATTACH DATABASE

但是,我建议在所有可能的情况下,使用具有多个表的单个数据库会更容易使用(关系数据库管理系统的一件事是关系(相互关联的表)在名称)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2018-01-17
    • 2012-04-12
    相关资源
    最近更新 更多