数据库递归错误

时间:2015-01-29 12:40:38

标签: android database sqlite listview android-arrayadapter

我有一个有联系人的数据库。 从我的主要活动中,我调用了一个名为recuperarTodosContactos的函数,在那里我获得所有联系人,并将它们放在列表视图中。

我面临的问题是,如果数据库为空,则recuperarContactos失败并且未显示列表视图(崩溃)。如果我有带联系人的列表视图并开始删除它们直到没有联系人且列表视图为空,则不会发生这种情况。

所以我需要输入至少一个寄存器...理想情况下是oncreate.But它给了我一个递归getWriteble数据库的错误。

01-29 12:25:53.851: E/AndroidRuntime(583): java.lang.RuntimeException: Unable to start activity Component-info{com.example.informacion/com.example.informacion.MainActivity}: java.lang.IllegalStateException: getWritableDatabase called recursively

我的数据库(重要的事情):

  public BaseDatosContactos(Context context) {
        super(context, NOMBRE_BASEDATOS, null, VERSION_BASEDATOS);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(CREAR_TABLA); //db.execSQL(TABLA_CONTACTOS);
        //addContacto(new contactoAgenda("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",true, true, false, false, false,"Familia", R.drawable.hulk));
        insertarContacto("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",1, 1, 0, 0, 0,"Familia", R.drawable.hulk);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        // db.execSQL("DROP TABLE IF EXISTS " + TABLA_CONTACTOS);
            db.execSQL("DROP TABLE IF EXISTS " + TABLA);
            onCreate(db);

    }

    public void insertarContacto ( String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
        SQLiteDatabase db = getWritableDatabase();
        if (db != null) {
            ContentValues valores = new ContentValues();
            valores.put("nombre", nombre);
            valores.put("direccion", direccion);
            valores.put("telefono", telefono);
            valores.put("email", email);
            valores.put("miembrofacebook", miembrofacebook);
            valores.put("miembrotwitter", miembrotwitter);
            valores.put("miembrogoogle", miembrogoogle);
            valores.put("miembrolinkedin", miembrolinkedin);
            valores.put("sexo", sexo);
            valores.put("tipocontacto", tipocontacto);
            valores.put("imagen", imagen);
            //db.insert("contactos", null, valores);
             try {
                    db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
                } catch (SQLiteConstraintException e) {
                    Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
                    //return false;
                }

        }
        db.close();   
    }



public ArrayList<contactoAgenda> recuperarTodosContactos() {
        SQLiteDatabase db = getReadableDatabase();
        ArrayList<contactoAgenda> lista_contactos = new ArrayList<contactoAgenda>();
        String[] valores_recuperar = {"nombre","direccion","telefono","email","miembrofacebook","miembrotwitter","miembrogoogle","miembrolinkedin","sexo","tipocontacto","imagen"};
        Cursor c = db.query("contactos", valores_recuperar, null, null, null, null, null, null);
       if (c==null){
        //perhaps something here when database table is empty ??   
       }
        c.moveToFirst();
        do {
            contactoAgenda contactos = new contactoAgenda(c.getString(0), c.getString(1), c.getString(2), c.getString(3),c.getInt(4), c.getInt(5), c.getInt(6), c.getInt(7),c.getInt(8), c.getString(9), c.getInt(10));
            lista_contactos.add(contactos);
        } while (c.moveToNext());


        db.close();
        c.close();
        return lista_contactos;
    }

有任何想法或帮助吗?:当从recuperarContactos获得的arraylist为空(数据库中没有任何联系人)时,带有图像的Listview和两个崩溃的文本。这是第一次发生..

public contactoAdapter(Context context, ArrayList<contactoAgenda> datos) {
                super(context, R.layout.listview_item, datos);
                // Guardamos los par�metros en variables de clase.
                this.context = context;
                this.datos = datos;
            }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View item = convertView; 
            contactoHolder holder;

            if (item == null) {
                item = LayoutInflater.from(context).inflate(R.layout.listview_item,
                        null);

                holder = new contactoHolder();
                holder.imgContacto = (ImageView) item.findViewById(R.id.imagenContacto);
                holder.tvMail = (TextView) item.findViewById(R.id.tvMail);
                holder.tvNombre = (TextView) item.findViewById(R.id.tvNombre);

                // Almacenamos el holder en el Tag de la vista.
                item.setTag(holder);
            }

            holder = (contactoHolder) item.getTag();

           holder.imgContacto.setImageResource(datos.get(position).getDrawableImageID());

            holder.tvNombre.setText(datos.get(position).getNombre());
            holder.tvMail.setText(datos.get(position).getDireccion());


            return item;
        }

1 个答案:

答案 0 :(得分:2)

在onCreate中,您将获得一个数据库连接,然后调用insertarContacto,这将创建一个额外的数据库连接。您应该为插入函数提供预先存在的连接。