Android 数据库递归错误

Android 数据库递归错误,android,database,sqlite,listview,android-arrayadapter,Android,Database,Sqlite,Listview,Android Arrayadapter,我有一个数据库和联系人。 在我的主要活动中,我调用了一个名为RecurPeratorTosContactOS的函数,在该函数中我获取了所有联系人,并将它们放在列表视图中 我面临的问题是,如果数据库为空,RecurPerarContectos将失败,并且列表视图不会显示(崩溃)。如果我的列表视图中有联系人并开始删除他们,直到没有联系人且列表视图为空,则不会发生这种情况 所以我需要输入至少一个寄存器。。。理想情况下是oncreate。但它给了我一个递归getWriteble数据库的错误 01-29

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

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

所以我需要输入至少一个寄存器。。。理想情况下是oncreate。但它给了我一个递归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(上下文){
super(上下文,NOMBRE_BASEDATOS,null,VERSION_BASEDATOS);
}
@凌驾
public void onCreate(SQLiteDatabase db){
//TODO自动生成的方法存根
db.execSQL(CREAR\u TABLA);//db.execSQL(TABLA\u CONTACTOS);
//addContacto(新的contactoAgenda(“贝伦”、“c/Diego Madrazo”、“1”和belen@gmail.com,真,真,假,假,假,“家庭”,R.drawable.hulk);
insertarContacto(“贝伦”、“c/Diego Madrazo”、“1”和belen@gmail.com“,1,1,0,0,0,“家族”,R.可牵引的绿巨人);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//TODO自动生成的方法存根
//db.execSQL(“如果存在删除表”+TABLA_CONTACTOS);
db.execSQL(“如果存在删除表”+TABLA);
onCreate(db);
}
public void insertarContacto(字符串nombre、字符串direccion、字符串telefono、字符串email、int-miembrofcook、int-miembrotwitter、int-miembrologole、int-miembrolinkedin、int-sexo、字符串tipocontacto、int-imagen){
SQLiteDatabase db=getWritableDatabase();
如果(db!=null){
ContentValues valores=新ContentValues();
瓦洛雷斯。普特(“nombre”,nombre);
valores.put(“direccion”,direccion);
瓦洛丽丝.普特(telefono,telefono);
valores.put(“电子邮件”,email);
valores.put(“miembrofacook”,miembrofacook);
瓦洛雷斯。普特(“米姆布罗特维特”,米姆布罗特维特);
valores.put(“miembrologle”,miembrologle);
瓦洛雷斯。普特(“米姆布罗林克丁”,米姆布罗林克丁);
瓦洛雷斯。普特(“塞索”,塞索);
valores.put(“tipocontacto”,tipocontacto);
valores.put(“imagen”,imagen);
//db.插入(“contactos”,空,valores);
试一试{
db.insertOrThrow(TABLA,null,valores);//TABLA por“contactos”
}捕获(SQLITE){
Log.d(标签,“插入法:存在的克拉维阶段”);
//返回false;
}
}
db.close();
}
公共阵列列表RecurperatorTosContactOS(){
SQLiteDatabase db=getReadableDatabase();
ArrayList list a_contactos=新建ArrayList();
字符串[]valores_reciperar={“nombre”、“direccion”、“telefono”、“email”、“miembrofcook”、“miembrotwitter”、“miembrologole”、“miembroinkedin”、“sexo”、“tipocontecto”、“imagen”};
游标c=db.query(“contactos”,valores\u reciperar,null,null,null,null,null);
如果(c==null){
//当数据库表为空时,这里可能有什么东西??
}
c、 moveToFirst();
做{
contactoAgenda contactos=新联系人OAGenda(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));
列表a_contactos.add(contactos);
}而(c.moveToNext());
db.close();
c、 close();
返回列表a_contactos;
}
有什么想法或帮助吗?:当从RecurPerarContectos获取的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;
        }
public contactoAdapter(上下文,数组列表datos){
super(上下文,R.layout.listview_项,datos);
//瓜尔达莫斯�地下铁道。
this.context=上下文;
this.datos=datos;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图项=转换视图;
接触器支架;
如果(项==null){
item=LayoutFlater.from(上下文)。充气(R.layout.listview_项,
无效);
支架=新触点支架();
holder.imgContacto=(ImageView)item.findViewById(R.id.imagenContacto);
holder.tvMail=(TextView)item.findViewById(R.id.tvMail);
holder.tvNombre=(TextView)item.findViewById(R.id.tvNombre);
//阿尔马塞纳莫斯市的灯座位于维斯塔的标签上。
项目.setTag(支架);
}
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());
退货项目;
}

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

如何??我称之为db.insertOrThrow(TABLA,null,valores);其中valores是一个contentvalues与我的联系人。listview崩溃有什么解决方案吗??如果数据库是空的,它应该显示一个空的listview…谢谢如果数据库是空的,它将工作,但是如果数据库不存在,它将尝试创建它,从而导致错误。关于如何操作:请参见将
onCreate
接收
SQLiteDatabase
作为参数的方式?对insertarContacto执行相同的操作。id说:db.execSQL(C
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;
        }