无法从SQlite数据库获取特定数据

时间:2019-05-17 10:26:22

标签: android sqlite android-studio android-recyclerview android-sqlite

我正在开发需要从sqlite获取特定列数据的android应用程序。表中的数据显示完美,但是当我尝试从sqlite获取特定的数据列时,应用崩溃了,无法在回收商列表中显示数据。

我尝试了不同的解决方案,并在网络上搜索以获得满意的解决方案,但无法解决此问题。

当按钮单击功能运行时,与数据库相关的应用程序出错。 错误始终在SQLiteDatabase db = this.getReadableDatabase();

行上

这是我的数据库助手类

{

// Database Version
private static final int DATABASE_VERSION = 2;
Context context;

// Database Name
private static final String DATABASE_NAME = "DynamicERP.db";

public static final String table_orders = "TABLEORDERS";
public static final String table_poducts_records = "PRODUCTSRECORDS";


public static final String code = "ORDERCODE";
public static final String barcode = "BARCODE";
public static final String nametblp = "NAME";
public static final String size = "SIZE";
public static final String uname = "UNAME";
public static final String retail = "RETAIL";
public static final String wholesale = "WHOLESALE";
public static final String trade = "TRADE";
public static final String percentage = "PERCENTAGE";
public static final String tax = "TAX";
public static final String subcatagary = "SUBCATAGARY";
public static final String categary = "CATEGARY";
public static final String company = "COMPANY";
public static final String type = "TYPE";
public static final String packsize = "PACKSIZE";
public static final String weight = "WEIGHT";
public static final String weightunit = "WEIGHTUNIT";
public static final String currentstock = "CURRENTSTOCK";


public static final String salecode = "SALECODE";
public static final String mcode = "MCODE";
public static final String fname = "FIRSTNAME";
public static final String lname = "LASTNAME";
public static final String urduname = "URDUNAME";
public static final String address = "ADDRESS";
public static final String contact = "CONTACT";
public static final String cnic = "CNIC";
public static final String saletype = "TYPE";
public static final String route = "ROUTE";
public static final String area = "AREA";
public static final String zone = "ZONE";
public static final String balance = "BALANCE";
public static final String creditlimit = "CREDITLIMIT";
public static final String spl = "SPL";
public static final String saletax = "SALETAX";

private static final String DATABASE_ORDERS = "CREATE TABLE " + table_orders + "("
        + code + " INTEGER, " + barcode + " VARCHAR," + nametblp + " VARCHAR," + size + " VARCHAR," + uname +
        " VARCHAR," + retail + " VARCHAR," + wholesale + " VARCHAR," + trade + " VARCHAR,"
        + percentage + " VARCHAR," + tax + " VARCHAR," + subcatagary + " VARCHAR," + categary + " VARCHAR," +
        company + " VARCHAR," + type + " VARCHAR," + packsize + " VARCHAR," +
        weight + " VARCHAR," + weightunit + " VARCHAR, " + currentstock + " VARCHAR );";


private static final String DATABASE_PRODUCTS = "CREATE TABLE " + table_poducts_records + "("
        + salecode + " INTEGER, " + mcode + " VARCHAR, " + fname + " VARCHAR, " + lname + " VARCHAR, " + urduname +
        " VARCHAR, " + address + " NVARCHAR, " + contact + " VARCHAR," + cnic + " VARCHAR, " + saletype + " VARCHAR,"
        + route + " VARCHAR, " + area + " VARCHAR," + zone + " VARCHAR," +
        balance + " VARCHAR, " + creditlimit + " VARCHAR," + spl + " VARCHAR, " + saletax + " VARCHAR);";

private String DROP_ORDER_REC = "DROP TABLE IF EXISTS " + table_orders;
private String DROP_PRODUCTS_REC = "DROP TABLE IF EXISTS " + table_poducts_records;

/**
 * Constructor
 *
 * @param context
 */
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DATABASE_ORDERS);
    db.execSQL(DATABASE_PRODUCTS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_PRODUCTS_REC);
    db.execSQL(DROP_ORDER_REC);
    onCreate(db);

}

public void addProductRec() {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(salecode, "123456");
    values.put(mcode, "123654698");
    values.put(fname, "Usman");
    values.put(lname, "Ali");
    values.put(urduname, "Usman");
    values.put(contact, "021354545");
    values.put(cnic, "54548787515");
    values.put(saletype, "credit");
    values.put(route, "{Peshawer Road");
    values.put(area, "wah");
    values.put(zone, "Rawalpindi");
    values.put(balance, "1000");
    values.put(creditlimit, "10000");
    values.put(spl, "212");
    values.put(saletax, "10");
    values.put(address, "wah");
    // Inserting Row
    db.insert(table_poducts_records, null, values);
    db.close();
}


public void addOrders() {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(code, "098766");
    values.put(barcode, "5544444445");
    values.put(nametblp, "Usman");
    values.put(size, "12");
    values.put(uname, "Ali");
    values.put(retail, "500");
    values.put(wholesale, "whole");
    values.put(trade, "credit");
    values.put(percentage, "7");
    values.put(tax, "1000");
    values.put(subcatagary, "laptop");
    values.put(categary, "computers");
    values.put(company, "hp");
    values.put(type, "laptop");
    values.put(packsize, "12");
    values.put(weight, "5");
    values.put(weightunit, "kg");
    values.put(currentstock, "57");

    // Inserting Row
    db.insert(table_orders, null, values);
    db.close();
}

public List<GetSetOrders> getAllOrderData() {
    // array of columns to fetch
    String[] columns = {
            nametblp,
            code,
            retail,
            subcatagary,
            company,        };

    String sortOrder =
            code + " ASC";
    List<GetSetOrders> clientlist = new ArrayList<GetSetOrders>();


    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(table_poducts_records, //Table to query
            columns,    //columns to return
            null,        //columns for the WHERE clause
            null,        //The values for the WHERE clause
            null,       //group the rows
            null,       //filter by row groups
            sortOrder); //The sort order

    if (cursor.moveToFirst()) {
        do {
            GetSetOrders orders = new GetSetOrders();
            orders.setNAME(cursor.getString(cursor.getColumnIndex(nametblp)));
            orders.setORDERCODE(cursor.getString(cursor.getColumnIndex(code)));
            orders.setRETAIL(cursor.getString(cursor.getColumnIndex(retail)));
            orders.setCATEGARY(cursor.getString(cursor.getColumnIndex(subcatagary)));
            orders.setCOMPANY(cursor.getString(cursor.getColumnIndex(company)));
            // Adding user record to list
            clientlist.add(orders);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return clientlist;
}

}

这是我用来获取数据显示的Client类

{

Activity activity;
RecyclerView recyclerViewClients;
Button btnAll;
ClientRecyclerAdapter clientRecyclerAdapter;
List<GetSetOrders> listclients;
DatabaseHelper databaseHelper;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.clients, container, false);

// recyclerViewClients.setAdapter(clientRecyclerAdapter);

    btnAll=view.findViewById(R.id.searchall);
    recyclerViewClients=view.findViewById(R.id.Viewclients);

    listclients = new ArrayList<>();
    clientRecyclerAdapter = new ClientRecyclerAdapter(listclients,recyclerViewClients);
    recyclerViewClients.setItemAnimator(new DefaultItemAnimator());
    recyclerViewClients.setItemAnimator(new DefaultItemAnimator());
    recyclerViewClients.setHasFixedSize(true);
    recyclerViewClients.setAdapter(clientRecyclerAdapter);

    databaseHelper = new DatabaseHelper(activity);


    btnAll.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getClientFromSqlite();
            Toast.makeText(getActivity(), "Usman", Toast.LENGTH_SHORT).show();
        }
    });

    return view;
}

private void getClientFromSqlite() {

    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            listclients.clear();
            listclients.addAll(databaseHelper.getAllOrderData());
            clientRecyclerAdapter.notifyDataSetChanged();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            clientRecyclerAdapter.notifyDataSetChanged();
        }
    }.execute();
}

}

这是我的客户端适配器类

{

private List<GetSetOrders> listOrders;
Context mContext;
RecyclerView mRecyclerView;
View itemView;

public ClientRecyclerAdapter(List<GetSetOrders> listOrders, RecyclerView recyclerView) {
    this.listOrders =  listOrders;
    mRecyclerView = recyclerView;
}

@Override
public ClientViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    mContext = parent.getContext();
    itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.items_products_table, parent, false);

    return new ClientViewHolder(itemView);
}

public void addAll(ArrayList<GetSetOrders> listOrders) {
    this.listOrders = listOrders;
    notifyDataSetChanged();
}

public void clear() {
    this.listOrders.clear();
    notifyDataSetChanged();
}

public class ClientViewHolder extends RecyclerView.ViewHolder {

    //public AppCompatTextView ID;
    public TextView lblPName;
    public TextView lblTrade;
    public TextView lblRetail;
    public TextView lblSubCategary;
    public TextView lblCompany;
    RelativeLayout layout;

    public ClientViewHolder(View view) {
        super(view);


        lblPName =  view.findViewById(R.id.lblPName);
        lblTrade =  view.findViewById(R.id.lblTrade);
        lblRetail =  view.findViewById(R.id.lblRetail);
        lblSubCategary = view.findViewById(R.id.lblSubCategary);
        lblCompany =  view.findViewById(R.id.lblCompany);
        layout = view.findViewById(R.id.listprod);
    }
}

@Override
public void onBindViewHolder(ClientViewHolder holder, final int position) {

    holder.lblPName.setText(listOrders.get(position).getNAME());
    holder.lblTrade.setText(listOrders.get(position).getORDERCODE());
    holder.lblRetail.setText(listOrders.get(position).getRETAIL());
    holder.lblSubCategary.setText(listOrders.get(position).getSUBCATAGARY());
    holder.lblCompany.setText(listOrders.get(position).getCOMPANY());
    holder.layout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Toast.makeText(mContext, "ABC", Toast.LENGTH_SHORT).show();
            return false;
        }
    });

}

@Override
public int getItemCount() {
    Log.v(ClientRecyclerAdapter.class.getSimpleName(), "" + listOrders.size());
    return listOrders.size();

}

}

我想要获取所有上述代码的主要内容是;我只希望Sqlite数据库中的5列显示在列表中。

 java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.NullPointerException
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
    at com.example.tablewithlist.DatabaseHelper.getAllOrderData(DatabaseHelper.java:174)
    at com.example.tablewithlist.Clients$2.doInBackground(Clients.java:67)
    at com.example.tablewithlist.Clients$2.doInBackground(Clients.java:63)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)

1 个答案:

答案 0 :(得分:2)

请发布错误日志以更好地了解它,

根据此代码,我发现了两个问题

首先:-删除

clientRecyclerAdapter.notifyDataSetChanged();

来自doInBackground()的{​​{1}}

第二个:-

Asynctask

此行的末尾包含额外的String[] columns = { nametblp, code, retail, subcatagary, company, };

希望这对您有所帮助。

相关问题