获取SQLite数据库数据时出错

时间:2017-11-09 13:38:10

标签: android

  

11-09 13:12:46.0​​48 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();
        }
    }
}

在我看来,他在抱怨背景,但我无法解决。你能帮助我吗?谢谢!!

2 个答案:

答案 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