SQLite数据库数据展示报错求助:LinearLayout无法转为ActionBarContainer
先看你的报错堆栈,这个ClassCastException根本不是数据库操作导致的,是ActionBar初始化阶段出的问题!这类问题大多和Activity的布局或者主题配置有关,和你写的DBHelper代码没啥关系,先把这个关键点理清~
可能的原因及对应解决方案
1. 布局文件误用了系统ActionBar的容器ID
检查下Main2Activity对应的布局文件,有没有把某个LinearLayout的id设成了android:id="@+id/action_bar_container"?系统初始化ActionBar时会自动查找这个ID的容器,要是被你自定义的LinearLayout占了,就会直接抛出这个转换异常。
- 解决办法:把布局里这个错误的ID改掉,确保
action_bar_container这个ID不会被你自己的控件占用。
2. Activity主题配置冲突
你的Main2Activity应该是继承了AppCompatActivity吧?如果此时你给它设置的是不含ActionBar的主题(比如Theme.AppCompat.NoActionBar),或者主题配置和Activity的继承关系不匹配,也会触发这个问题。
- 解决办法:打开
AndroidManifest.xml,检查Main2Activity的主题设置,确保用的是带ActionBar的主题,比如:
<activity android:name=".Main2Activity" android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
要是你确实不需要ActionBar,别直接用无ActionBar的主题,而是在Activity的onCreate()里调用getSupportActionBar().hide()来隐藏,这样能避免系统初始化ActionBar时的冲突。
3. 自定义ActionBar布局配置错误
如果你给Activity设置了自定义ActionBar布局(用setCustomView()方法),要确保自定义布局的结构没干扰到系统默认的ActionBar容器。
- 解决办法:如果要用自定义ActionBar,按正确的方式来:
ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowCustomEnabled(true); actionBar.setCustomView(R.layout.your_custom_action_bar); // 自定义布局的根布局用LinearLayout/RelativeLayout这类普通容器就行,别和系统的ActionBarContainer搞混 }
顺便说下你的DBHelper代码
看你贴的getAllAlim()方法还没写完(写到SQLiteDatabase db= this.get就断了),等解决完ActionBar的崩溃问题后,你可以参考下面的写法完善数据库查询逻辑:
public List<Aliment> getAllAlim(){ List<Aliment> temp=new ArrayList<>(); SQLiteDatabase db= this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM your_table_name", null); // 替换成你的表名 if(cursor.moveToFirst()){ do{ // 根据你的Aliment类的字段来构造对象 Aliment aliment = new Aliment(); aliment.setId(cursor.getInt(cursor.getColumnIndex("id"))); // 替换成你的字段名 aliment.setName(cursor.getString(cursor.getColumnIndex("name"))); // 其他字段依次读取... temp.add(aliment); }while(cursor.moveToNext()); } cursor.close(); db.close(); return temp; }
内容的提问来源于stack exchange,提问作者Ada

