11-09 13:12:46.048 3310-3310 / com.dev.bob.aluguel_automovel E / AndroidRuntime:致命例外:主要 过程:com.dev.bob.aluguel_automovel,PID:3310
java.lang.NullPointerException:尝试调用虚方法 “android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String,int, android.database.sqlite.SQLiteDatabase $ CursorFactory, android.database.DatabaseErrorHandler)'在空对象引用上 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 com.dev.bob.aluguel_automovel.Model.DBAutomoveis.getAutoByType(DBAutomoveis.java:85) 在 com.dev.bob.aluguel_automovel.fragment.BasicoTabFragment。(BasicoTabFragment.java:29) 在 com.dev.bob.aluguel_automovel.activity.MainActivity $ SectionPagerAdapter.getItem(MainActivity.java:131) 在 android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:101) 在android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1005)
当我打开片段时,我会查找已注册的项目(测试),以便在列表中显示它们。 但是错误发生了(数据库锁定)。 代码如下: 片段:
public class BasicoTabFragment extends Fragment implements AdapterView.OnItemClickListener, MainInterface{
private ArrayList<Automoveis> automoveis = new ArrayList<>();
private DBAutomoveis dbAutomoveis;
private Context context;
BasicoAdapter adapter;
public BasicoTabFragment() {
this.dbAutomoveis = new DBAutomoveis(context);
this.automoveis = dbAutomoveis.getAutoByType("Executivo");
}
public static BasicoTabFragment newInstance(Context context) {
BasicoTabFragment fragment = new BasicoTabFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_basico_tab, container, false);
BasicoAdapter basicoAdapter = new BasicoAdapter(getActivity(),R.layout.list_basico,automoveis);
ListView listView = (ListView)view.findViewById(R.id.listview_basico);
listView.setAdapter(basicoAdapter);
return view;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
}
}
MainActivity:
.....
public class SectionPagerAdapter extends FragmentPagerAdapter {
public SectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new BasicoTabFragment();
case 1:
return new IntermediarioTabFragment();
case 2:
return new ExecutivoTabFragment();
default:
return new BasicoTabFragment();
}
}
数据库类:
public class DBAutomoveis extends SQLiteOpenHelper {
private static final String NOME_BD = "dbauto";
private static final int VERSAO_BD = 1;
private Context contexto;
public static final String AUTO_TABLE_NAME = "tableauto";
public static final String AUTO_COLUMN_ID = "id";
public static final String AUTO_COLUMN_NAME = "name";
public static final String AUTO_COLUMN_PRECO = "preco";
public static final String AUTO_COLUMN_TYPE = "type";
public static final String AUTO_COLUMN_DISPONIVEL = "disponivel";
private static final ArrayList<String> nomeAuto = new ArrayList<String>();
private static final ArrayList<String> precoAuto = new ArrayList<>();
private static final ArrayList<String> typeAuto = new ArrayList<>();
private static final int disponivelAuto = 0;
private int i=0;
public DBAutomoveis(Context context) {
super(context, NOME_BD, null, VERSAO_BD);
this.contexto = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String sql = "CREATE TABLE IF NOT EXISTS " + AUTO_TABLE_NAME + " ("
+ AUTO_COLUMN_ID + " integer primary key,"
+ AUTO_COLUMN_NAME + " text,"
+ AUTO_COLUMN_PRECO + " text,"
+ AUTO_COLUMN_TYPE + "text,"
+ AUTO_COLUMN_DISPONIVEL + "integer"
+ ")";
sqLiteDatabase.execSQL(sql);
_insert(sqLiteDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+AUTO_TABLE_NAME);
onCreate(sqLiteDatabase);
}
private void _insert(SQLiteDatabase dbsql) {
nomeAuto.add(0,"Uno 2017");
nomeAuto.add(1,"I30");
nomeAuto.add(2,"Jeep");
precoAuto.add(0,"29.000");
precoAuto.add(1,"45000");
precoAuto.add(2,"85000");
typeAuto.add(0,"Basico");
typeAuto.add(1,"Intermediário");
typeAuto.add(2,"Executivo");
try {
ContentValues values = new ContentValues();
for (i=0;nomeAuto.size() < 4;i++){
values.put(AUTO_COLUMN_ID, i);
values.put(AUTO_COLUMN_NAME, nomeAuto.get(i));
values.put(AUTO_COLUMN_PRECO, precoAuto.get(i));
values.put(AUTO_COLUMN_TYPE, typeAuto.get(i));
values.put(AUTO_COLUMN_DISPONIVEL, 0);
dbsql.insert(AUTO_TABLE_NAME,"",values);
}
} finally {
dbsql.close();
}
}
public ArrayList<Automoveis> getAutoByType(String type){
ArrayList<Automoveis> autos = new ArrayList<>();
String query = "SELECT * FROM "+AUTO_TABLE_NAME+" where type = '"+type+"'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query,null);
try {
Automoveis automoveis = null;
if (cursor.moveToFirst()) {
do {
automoveis = new Automoveis();
automoveis.id = cursor.getString(cursor.getColumnIndex(AUTO_COLUMN_ID));
automoveis.name = cursor.getString(cursor.getColumnIndex(AUTO_COLUMN_NAME));
automoveis.placa = cursor.getString(cursor.getColumnIndex(AUTO_COLUMN_PRECO));
automoveis.type = cursor.getString(cursor.getColumnIndex(AUTO_COLUMN_TYPE));
automoveis.disponivel = cursor.getInt(cursor.getColumnIndex(AUTO_COLUMN_DISPONIVEL));
autos.add(automoveis);
} while (cursor.moveToNext());
}
return autos;
}finally {
db.close();
}
}
}
在我看来,他在抱怨背景,但我无法解决。你能帮助我吗?谢谢!!
答案 0 :(得分:0)
似乎永远不会设置context
中的BasicoTabFragment
。不是在构造函数中初始化数据库,而是尝试在onCreate()
中实例化数据库:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.dbAutomoveis = new DBAutomoveis(getActivity());
this.automoveis = dbAutomoveis.getAutoByType("Executivo");
}
答案 1 :(得分:0)
context
的值为null:
您可以使用getActivity()
,它返回与片段相关联的活动
活动是上下文(因为活动扩展了上下文)。
所以:
public class BasicoTabFragment extends Fragment implements
AdapterView.OnItemClickListener, MainInterface{
private ArrayList<Automoveis> automoveis = new ArrayList<>();
private DBAutomoveis dbAutomoveis;
private Context context;
BasicoAdapter adapter;
public BasicoTabFragment() {
this.dbAutomoveis = new DBAutomoveis(context);
this.automoveis = dbAutomoveis.getAutoByType("Executivo");
}
public static BasicoTabFragment newInstance(Context context) {
BasicoTabFragment fragment = new BasicoTabFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_basico_tab, container, false);
BasicoAdapter basicoAdapter = new BasicoAdapter(getActivity(),R.layout.list_basico,automoveis);
ListView listView = (ListView)view.findViewById(R.id.listview_basico);
listView.setAdapter(basicoAdapter);
return view;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
}
}
将是
public class BasicoTabFragment extends Fragment implements
AdapterView.OnItemClickListener, MainInterface{
private ArrayList<Automoveis> automoveis = new ArrayList<>();
private DBAutomoveis dbAutomoveis;
private Context context;
BasicoAdapter adapter;
// public BasicoTabFragment() {
// this.dbAutomoveis = new DBAutomoveis(context);
// this.automoveis = dbAutomoveis.getAutoByType("Executivo");
// }
public static BasicoTabFragment newInstance(Context context) {
BasicoTabFragment fragment = new BasicoTabFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.dbAutomoveis = new DBAutomoveis(context);
this.automoveis = dbAutomoveis.getAutoByType("Executivo");
}
带有newInstance方法的和instantiale BasicoTabFragment