无法从数据库中检索数据,以完成列表视图

Posted

技术标签:

【中文标题】无法从数据库中检索数据,以完成列表视图【英文标题】:Failed to retrieve data from a database, to complete a listview 【发布时间】:2015-08-05 14:36:51 【问题描述】:

我正在使用数据库来完成列表视图。但是我遇到了一个没有解决的问题。 当我创建一个 Lugar 类的变量 lugar 时,问题就出现了。

这是 Lugar 的类代码:

public class Lugar 
    private String nombre;
    private String direccion;
    private GeoPuntoAlt posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;
    private TipoLugar tipo;

    public Lugar(String nombre, String direccion, double longitud,
                 double latitud, double altura, TipoLugar tipo,  int telefono, String url, String comentario,
                 int valoracion) 
        fecha = System.currentTimeMillis();
        posicion = new GeoPuntoAlt(longitud, latitud, altura);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
        this.tipo = tipo;
        fecha = System.currentTimeMillis();
        posicion = new GeoPuntoAlt(longitud, latitud, altura);
        tipo = TipoLugar.OTROS;
    


    public String getNombre() 
        return nombre;
    

    public void setNombre(String nombre) 
        this.nombre = nombre;
    

    public String getDireccion() 
        return direccion;
    

    public void setDireccion(String direccion) 
        this.direccion = direccion;
    

    public GeoPunto getPosicion() 
        return posicion;
    

    public void setPosicion(GeoPuntoAlt posicion) 
        this.posicion = posicion;
    

    public String getFoto() 
        return foto;
    

    public void setFoto(String foto) 
        this.foto = foto;
    

    public int getTelefono() 
        return telefono;
    

    public void setTelefono(int telefono) 
        this.telefono = telefono;
    

    public String getUrl() 
        return url;
    

    public void setUrl(String url) 
        this.url = url;
    

    public String getComentario() 
        return comentario;
    

    public void setComentario(String comentario) 
        this.comentario = comentario;
    

    public long getFecha() 
        return fecha;
    

    public void setFecha(long fecha) 
        this.fecha = fecha;
    

    public float getValoracion() 
        return valoracion;
    

    public void setValoracion(float valoracion) 
        this.valoracion = valoracion;
    

    public TipoLugar getTipo() 
        return tipo;
    

    public void setTipo(TipoLugar tipo) 
        this.tipo = tipo;
    

    @Override
    public String toString() 
        return "Lugar" +
                "nombre='" + nombre + '\'' +
                ", direccion='" + direccion + '\'' +
                ", posicion=" + posicion +
                ", foto='" + foto + '\'' +
                ", telefono=" + telefono +
                ", url='" + url + '\'' +
                ", comentario='" + comentario + '\'' +
                ", fecha=" + fecha +
                ", valoracion=" + valoracion +
                ", tipo=" + tipo +
                '';
    

这是 Lugar 类,其中 Element 方法是我输入的 lugar = new Lugar();。这条线给了我错误,我不明白为什么。

public class Lugares 

    private static LugaresBD lugaresBD;


    protected static List<Lugar> vectorLugares = ejemploLugares();

    public Lugares() 
        vectorLugares = ejemploLugares();
    

    public static Lugar elemento(int id) 
        Lugar lugar = null;
        SQLiteDatabase bd = lugaresBD.getReadableDatabase();
        Cursor cursor = bd.rawQuery("SELECT * FROM lugares WHERE _id = " + id, null);
        if (cursor.moveToNext())
            lugar = new Lugar();
            lugar.setNombre(cursor.getString(1));
            lugar.setDireccion(cursor.getString(2));
            lugar.setPosicion((GeoPuntoAlt) new GeoPunto(cursor.getDouble(3), cursor.getDouble(4)));
            lugar.setTipo(TipoLugar.values()[cursor.getInt(5)]);
            lugar.setFoto(cursor.getString(6));
            lugar.setTelefono(cursor.getInt(7));
            lugar.setUrl(cursor.getString(8));
            lugar.setComentario(cursor.getString(9));
            lugar.setFecha(cursor.getLong(10));
            lugar.setValoracion(cursor.getFloat(11));
        
        cursor.close();
        bd.close();
        return lugar;
    

    static void anyade(Lugar lugar)
        vectorLugares.add(lugar);
    

    final static String TAG = "MisLugares";
    protected static GeoPunto posicionActual = new GeoPunto(0,0);

    static int nuevo()
        Lugar lugar = new Lugar("1Escuela Politécnica Superior de Gandía",
                "C/ Paranimf, 1 46730 Gandia (SPAIN)", -0.166093, 38.995656, 1500,
                TipoLugar.EDUCACION,962849300, "http://www.epsg.upv.es",
                "Uno de los mejores lugares para formarse.", 3);
        vectorLugares.add(lugar);
        return vectorLugares.size()-1;
    

    static void borrar(int id)
        vectorLugares.remove(id);
    

    public static int size() 
        return vectorLugares.size();
    

    public static ArrayList<Lugar> ejemploLugares() 
        ArrayList<Lugar> lugares = new ArrayList<Lugar>();
        lugares.add(new Lugar("Escuela Politécnica Superior de Gandía",
                "C/ Paranimf, 1 46730 Gandia (SPAIN)", -0.166093, 38.995656, 800,
                TipoLugar.EDUCACION,962849300, "http://www.epsg.upv.es",
                "Uno de los mejores lugares para formarse.", 3));

        lugares.add(new Lugar("Al de siempre",
                "P.Industrial Junto Molí Nou - 46722, Benifla (Valencia)",
                -0.190642, 38.925857, 150, TipoLugar.BAR, 636472405, "",
                "No te pierdas el arroz en calabaza.", 3));

        lugares.add(new Lugar("androidcurso.com",
                "ciberespacio", 0.0, 0.0, 2000, TipoLugar.EDUCACION,
                962849300, "http://androidcurso.com",
                "Amplia tus conocimientos sobre Android.", 5));

        lugares.add(new Lugar("Barranco del Infierno",
                "Vía Verde del río Serpis. Villalonga (Valencia)",
                -0.295058, 38.867180, 000, TipoLugar.NATURALEZA,

                0, "http://sosegaos.blogspot.com.es/2009/02/lorcha-villalonga-via-verde-del-rio.html",
                "Espectacular ruta para bici o andar", 4));

        lugares.add(new Lugar("La Vital",
                "Avda. de La Vital, 0 46701 Gandía (Valencia)",
                -0.1720092, 38.9705949, 400, TipoLugar.COMPRAS,
                962881070, "http://www.lavital.es/",
                "El típico centro comercial", 2));

        return lugares;

    

    static List listaNombres()
        ArrayList resultado = new ArrayList();
        for (Lugar lugar:vectorLugares)
            resultado.add(lugar.getNombre());
        
        return resultado;
    

    public static void indicializaBD(Context contexto)
        lugaresBD = new LugaresBD(contexto);
    

    public static Cursor listado() 
        SQLiteDatabase bd = lugaresBD.getReadableDatabase();
        return bd.rawQuery("SELECT * FROM lugares", null);
    

示例错误如下:

Lugar 中的 Lugar() 不能应用于:

非常感谢你的帮助,我学到了很多东西。

【问题讨论】:

【参考方案1】:

因为你有

public Lugar(String nombre, String direccion, double longitud,
             double latitud, double altura, TipoLugar tipo,  int telefono, String url, String comentario,
             int valoracion) 

在您的 Lugar 类中,默认构造函数将不可用。

要么你需要总是使用上面的构造函数,要么定义一个空的构造函数

public Lugar() 

阅读更多here

【讨论】:

非常感谢 Mithun 的回复。我定义了一个空的构造函数,错误消失了。但是,当您按下列表视图中的某个项目时,应用程序将关闭。 我提出了另一个问题,因为我认为它与主要问题有关。

以上是关于无法从数据库中检索数据,以完成列表视图的主要内容,如果未能解决你的问题,请参考以下文章

android - 在更改 EditText 值时无法更新列表视图

如何在我的 for 循环之外执行代码(需要等到循环完成从 Firebase 数据库中检索数据)?

列表视图在流完成检索数据之前引发错误

无法使用光标从数据库中成功检索Spinner选定的项目文本以填充我的应用程序中的联系人列表项目

从列表视图中检索数据并将其显示在文本视图/图像视图中

如何从列表视图中从 onItemClick() 获得的列表项的联系人 Uri 中检索数据?