Как отфильтровать значения второго счетчика из базы данных на основе выбора, выполненного в первом счетчике? - PullRequest
0 голосов
/ 11 февраля 2019

Я устанавливаю новое действие с именем «Диспетчерский отчет», в котором есть два счетчика: CustomerSpinner и LotSpinner.

LotSpinner показывает все лоты в таблице отгрузки вместо того, чтобы показывать только те лоты, которые относятся к клиенту, выбранному в первом спиннере.

Я получил значение CustomerSpinner из таблицы отправки.В LotSpinner также извлекаются номера лотов из таблицы отправки, но не фильтруются в соответствии с выбором клиента.

DispatchReportActivity.Java

// Fetching customer from dispatch table  
private void loadCustomerNameDispatch() {
    DatabaseHelper db = new DatabaseHelper( getApplicationContext() );

        List<String> lables1 = db.getFirmNAmeMoveStock();
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, lables1);
        dataAdapter           .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // attaching data adapter to spinner
        spinCustomer.setAdapter(dataAdapter);
        spinCustomer.setOnItemSelectedListener(this);
    }

// Fetching lot from dispatch table
    private void loadLotbyCustomerDispatch() {
        // database handler
        DatabaseHelper db = new DatabaseHelper(getApplicationContext());
        // Spinner Drop down elements
        List<String> lables = db.getLotbyCustomer();
        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, lables);
        // Drop down layout style - list view with radio button
        dataAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // attaching data adapter to spinner
        spinLotbyCustomer.setAdapter(dataAdapter);
    }

DATABASEHELPER.Java

//Get firm name in Dispatch Stock Report screen
public List < String > getFirmNAmeMoveStock() {
    List < String > labels = new ArrayList < String > ();

    // Select all query
    String selectQuery = "SELECT * FROM " + Table_Inventory;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // Looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(3));
            Set < String > set = new HashSet < >(labels);
            labels.clear();
            labels.addAll(set);
        } while ( cursor . moveToNext ());
    }

    // Closing connection
    cursor.close();
    db.close();

    // Returning lables
    return labels;
}

// Method to get Lot No. in Dispatch Stock Report Activity
public List < String > getLotbyCustomer() {
    List < String > labels1 = new ArrayList < String > ();

    // Select all query
    String selectQuery = "SELECT * FROM " + Table_StockDispatch;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            labels1.add(cursor.getString(4));
            Set < String > set = new HashSet < >(labels1);
            labels1.clear();
            labels1.addAll(set);
        } while ( cursor . moveToNext ());
    }

    // Closing connection
    cursor.close();
    db.close();

    // Returning lables
    return labels1;
}

Будет несколько клиентов, и у каждого клиента может быть несколько лотов, поэтому я хочу, чтобы второй счетчик показывал только те лоты, которые относятся к клиенту, выбранному в первом счетчике.

1 Ответ

0 голосов
/ 12 февраля 2019

Я бы предложил использовать адаптеры Cursor и Cursor, которые могут упростить задачу: -

  • нет необходимости в промежуточных массивах (одна из ваших проблем заключается в том, что строковые массивы не предоставляют достаточной информации
  • CursorAdapters предназначены для обработки id (необходимо указать, что они существуют в курсоре с именем столбца _id (см. Использованиеиз BaseColumns._ID ниже)).

Ниже приведен базовый пример связанных блесен на основе ваших требований.

Сначала DatbaseHelper DatabaseHelper.java

Определены / созданы две таблицы Customers и Lots, существуют методы для добавления данных для каждой из них, также как и методы для извлечения списка из каждой из таблиц.Извлеченные лоты основаны на клиенте, на которого они ссылаются / относятся / связываются с ним.

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;
    public static final String TBL_CUSTOMER = "customer";
    public static final String TBL_LOT = "lot";


    public static final String COL_CUSTOMER_ID = BaseColumns._ID; //<<<<<<<<<< column name is _id (needed for Cursor Adapter)
    public static final String COL_CUSTOMER_NAME = "customer_name";

    public static final String COL_LOT_ID = BaseColumns._ID; //<<<<<<<<<< column name is _id (needed for Cursor Adapter)
    public static final String COL_LOT_NAME = "lot_name";
    public static final String COL_LOT_CUSTOMERREFERENCE = "customer_refererence";

    SQLiteDatabase mDB;

    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase(); //<<<<<<<<<< get the database connection (force create when constructing helper instance)
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String crt_customer_table_sql = "CREATE TABLE IF NOT EXISTS " + TBL_CUSTOMER + "(" +
                COL_CUSTOMER_ID + " INTEGER PRIMARY KEY, " +
                COL_CUSTOMER_NAME + " TEXT UNIQUE " +
                ")";

        String crt_lot_table_sql = "CREATE TABLE IF NOT EXISTS " + TBL_LOT + "(" +
                COL_LOT_ID + " INTEGER PRIMARY KEY, " +
                COL_LOT_NAME + " TEXT, " +
                COL_LOT_CUSTOMERREFERENCE + " INTEGER " +
                /*?????????? OPTIONAL IF FOREIGN KEYS ARE TURNED ON
                "REFERENCES " + TBL_CUSTOMER + "(" +
                COL_CUSTOMER_ID +
                ")" +
                */
                ")";
        db.execSQL(crt_customer_table_sql);
        db.execSQL(crt_lot_table_sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long addCustomer(String name) {
        ContentValues cv = new ContentValues();
        cv.put(COL_CUSTOMER_NAME,name);
        return mDB.insert(TBL_CUSTOMER,null,cv);
    }

    public long addLot(String name, long customer_reference) {
        ContentValues cv = new ContentValues();
        cv.put(COL_LOT_NAME,name);
        cv.put(COL_LOT_CUSTOMERREFERENCE,customer_reference);
        return mDB.insert(TBL_LOT,name,cv);
    }

    public Cursor getCustomers() {
        return mDB.query(TBL_CUSTOMER,null,null,null,null,null,COL_CUSTOMER_NAME);
    }

    public Cursor getLotsPerCustomer(long customer_id) {
        String whereclause = COL_LOT_CUSTOMERREFERENCE + "=?";
        String[] whereargs = new String[]{String.valueOf(customer_id)};
        return mDB.query(TBL_LOT,null,whereclause,whereargs,null,null,COL_LOT_NAME);
    }
}
  • Обратите внимание, что приведенное выше довольно просто.Тем не менее, очевидно, что он должен быть адаптирован к вашему приложению.

Второй код - это действие, которое использует вышеупомянутое и включает в себя 2 связанных / связанных счетчика, где выбираемые лоты соответствуют этим лотам.связан с текущим выбранным клиентом.

Макет, используемый для действия, является очень простым, он просто имеет два счетчика.Спинеры используют стандартную компоновку Simple_List_Item_2 (2 используется для просмотра всех важных идентификаторов (обычно пользователю не показываются идентификаторы)).

Короче говоря, каждый раз, когда выбор делается в клиентеspinner Управление счетчиком лота (настройка или обновление) осуществляется на основе идентификатора клиента, который используется для выбора связанных / эталонных лотов.

public class MainActivity extends AppCompatActivity {

    Context mContext;
    DatabaseHelper mDBHlpr;
    SimpleCursorAdapter mCustomerSCA, mLotSCA;
    Spinner mCustomerList, mLotList;
    Cursor mCustomers, mLots;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        mDBHlpr = new DatabaseHelper(this);
        mCustomerList = this.findViewById(R.id.customer_list);
        mLotList = this.findViewById(R.id.lot_list);

        addTestingDataIfNoData(); //Go and add some testing data if there is none
        manageCustomerSpinner();
    }

    private void manageCustomerSpinner() {
        mCustomers = mDBHlpr.getCustomers();
        if (mCustomerSCA == null) {
            mCustomerSCA = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,
                    mCustomers,
                    new String[]{
                            DatabaseHelper.COL_CUSTOMER_NAME,
                            DatabaseHelper.COL_CUSTOMER_ID
                    },
                    new int[]{
                            android.R.id.text1,
                            android.R.id.text2
                    },
                    0
            );
            mCustomerList.setAdapter(mCustomerSCA);

            mCustomerList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    manageLotSpinner(id); //<<<<<<<<<< WHENEVER CUSTOMER IS SELECTED THE LOT SPINNER IS MANAGED >>>>>>>>>>
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        } else {
            mCustomerSCA.swapCursor(mCustomers);
        }
    }

    private void manageLotSpinner(long id) {
        mLots = mDBHlpr.getLotsPerCustomer(id);
        if (mLotSCA == null) {
            mLotSCA = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,
                    mLots,
                    new String[]{
                            DatabaseHelper.COL_LOT_NAME,
                            DatabaseHelper.COL_LOT_ID
                    },
                    new int[]{
                            android.R.id.text1,
                            android.R.id.text2
                    },
                    0
            );
            mLotList.setAdapter(mLotSCA);
        } else {
            mLotSCA.swapCursor(mLots);
        }
    }


    private void addTestingDataIfNoData() {
        if (DatabaseUtils.queryNumEntries(mDBHlpr.getWritableDatabase(),DatabaseHelper.TBL_CUSTOMER) < 1) {
            mDBHlpr.addCustomer("Fred");
            mDBHlpr.addCustomer("Mary");
            mDBHlpr.addCustomer("Sue");
            mDBHlpr.addCustomer("Alan");

            mDBHlpr.addLot("Lot001",2); // Lot for mary
            mDBHlpr.addLot("Lot002",1); // Lot for fred
            mDBHlpr.addLot("Lot003",4); // Lot for ala
            mDBHlpr.addLot("Lot004",3); // Lot for sue
            mDBHlpr.addLot("Lot005",3); // Lot for sue
            mDBHlpr.addLot("Lot006",3); // Lot for use
            mDBHlpr.addLot("Lot007",2); // Lot for mary
            mDBHlpr.addLot("Lot008",2); // Lot for mary
            mDBHlpr.addLot("Lot009",2); // Lot for mary
            mDBHlpr.addLot("Lot0010",2); // Lot for mary
            mDBHlpr.addLot("Lot0020",1); // Lot for Fred
            mDBHlpr.addLot("Lot00130",4); // Lot for Alan
            mDBHlpr.addLot("Lot00130",3); // Lot for Sue
        }
    }
}  

Пример результата

Initial

enter image description here

  • Алан является первоначальным выбором из-за порядка сортировки

После выбора Мэри

enter image description here

  • Примечание. Названия лотов в том виде, в каком они использовались, на самом деле не подходят для сортировки
...