Представление поиска в базе данных Sqlite не работает - PullRequest
0 голосов
/ 21 мая 2019

Я работаю над приложением, которое существует Sqlite Database.Что я сделал, чтобы реализовать поиск в базе данных sqlite с использованием списка, я реализовал подобный запрос, и я узнал;Поиск не ищет данные из sqlite ...

Вот мой файл Sqlite ....

    public List<GetSetClientsDetail> SearchClientsData() {

    String[] columns = {
            fname,
            route,
            cnic,
            lname,
            contact
    };

    String sortOrder = fname + " ASC";

    List<GetSetClientsDetail> clientlist = new ArrayList<GetSetClientsDetail>();

    SQLiteDatabase db = this.getReadableDatabase();


    Cursor cursor = db.query(
            table_poducts_records,
            new String[] { fname, route, cnic, lname, contact},
            fname + " LIKE '%" + fname + "%'",
            null, null, null, null, null);


    if (cursor.moveToFirst()) {
        do {
            GetSetClientsDetail clientsDetail = new GetSetClientsDetail();

            clientsDetail.setFNAME(cursor.getString(cursor.getColumnIndex(fname)));
            clientsDetail.setROUTE(cursor.getString(cursor.getColumnIndex(route)));
            clientsDetail.setCNIC(cursor.getString(cursor.getColumnIndex(cnic)));
            clientsDetail.setLNAME(cursor.getString(cursor.getColumnIndex(lname)));
            clientsDetail.setCONTACT(cursor.getString(cursor.getColumnIndex(contact)));
            clientlist.add(clientsDetail);

        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return clientlist;
}

Вот мой класс просмотра страницы просмотра, где я реализовал поиск ..

public class Clients extends Fragment {
RecyclerView recyclerViewClients;
Button btnAll;
SearchView searchViewclient;
ClientRecyclerAdapter clientRecyclerAdapter;
List<GetSetClientsDetail> listclients;
DatabaseHelper databaseHelper;

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

    btnAll=view.findViewById(R.id.searchallclients);
    recyclerViewClients=view.findViewById(R.id.recyclerviewallclients);
    searchViewclient=view.findViewById(R.id.searchclient);
    listclients = new ArrayList<>();

    clientRecyclerAdapter = new ClientRecyclerAdapter(listclients,recyclerViewClients);
    recyclerViewClients.setItemAnimator(new DefaultItemAnimator());
    recyclerViewClients.setItemAnimator(new DefaultItemAnimator()); //multi copy paste!
    recyclerViewClients.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerViewClients.setHasFixedSize(true);
    recyclerViewClients.setAdapter(clientRecyclerAdapter);

    databaseHelper = new DatabaseHelper(getActivity());

    searchViewclient.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SearchSQliteClientData();
        }
    });

    btnAll.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getClientFromSqlite();
        }
    });

    return view;
}

@SuppressLint("StaticFieldLeak")
private void SearchSQliteClientData() {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            listclients.clear();
            listclients.addAll(databaseHelper.SearchClientsData());
            return null;
        }

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


@SuppressLint("StaticFieldLeak")
private void getClientFromSqlite() {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            listclients.clear();
            listclients.addAll(databaseHelper.getAllClientsData());
            return null;
        }

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

}

Что я хочу сделать, так это нажать A в окне поиска;Он приносит все данные, связанные с или Если я нажимаю на букву. Он приносит эти данные в список, который я реализовал.

Cannot Resolve Method Query

1 Ответ

2 голосов
/ 21 мая 2019

Как пример

изменить public List<GetSetClientsDetail> SearchClientsData()

до

public List<GetSetClientsDetail> SearchClientsData(String mysearchstring)
  • это позволяет аргументу поиска передаваться методу от вызывающей стороны

Затем измените: -

Cursor cursor = db.query(
            table_poducts_records,
            new String[] { fname, route, cnic, lname, contact},
            fname + " LIKE '%" + fname + "%'",
            null, null, null, null, null);

до

String[] whereargs = new String[]{"%" + mysearchstring + "%"}; //<<<<<<<<<< ADDED
Cursor cursor = db.query(
            table_poducts_records,
            new String[] { fname, route, cnic, lname, contact},
            fname + " LIKE ?", //<<<<<<<<<< CHANGED
            whereargs, //<<<<<<<<<< ADDED
            null, null, null); //<<<<<<<<<< 3 nulls instead of 4 (as whereargs has replaced first null)
  • при этом используется аргумент поиска, переданный методу в предложении LIKE для защиты от SQL-инъекции

В качестве теста попробуйте: -

 listclients.addAll(databaseHelper.SearchClientsData("A")); //<<<<<<<<<< look for all with A anywhere in the fname column

Рабочий пример

Ниже приведен рабочий пример, основанный на указанном коде, но упрощенный для удобства.

Основное изменение в два раза больше, приведенный выше код находится в помощнике базы данных DatabaseHelper.java согласно: -

То есть метод SearchClientData: -

public List<GetSetClientsDetail> SearchClientsData(String mysearchstring) {

    String[] columns = {
            fname, route, cnic, lname, contact
    };

    String sortOrder = fname + " ASC";
    List<GetSetClientsDetail> clientlist = new ArrayList<GetSetClientsDetail>();
    SQLiteDatabase db = this.getReadableDatabase();

    String[] whereargs = new String[]{"%" + mysearchstring + "%"}; //<<<<<<<<<< ADDED
    Cursor cursor = db.query(
            table_poducts_records,
            new String[]{fname, route, cnic, lname, contact},
            fname + " LIKE ?",
            whereargs,
            null, null, sortOrder, null
    );
    if (cursor.moveToFirst()) {
        do {
            GetSetClientsDetail clientsDetail = new GetSetClientsDetail();

            clientsDetail.setFNAME(cursor.getString(cursor.getColumnIndex(fname)));
            clientsDetail.setROUTE(cursor.getString(cursor.getColumnIndex(route)));
            clientsDetail.setCNIC(cursor.getString(cursor.getColumnIndex(cnic)));
            clientsDetail.setLNAME(cursor.getString(cursor.getColumnIndex(lname)));
            clientsDetail.setCONTACT(cursor.getString(cursor.getColumnIndex(contact)));
            clientlist.add(clientsDetail);
        } while (cursor.moveToNext());
    }
    cursor.close();
    return clientlist;
}

public List<GetSetClientsDetail> getAllClientsData() {
    return SearchClientsData("");
} 
  • Обратите внимание, что freeBie getAllClientsData просто использует метод SearchClientData, передавая "", который выберет все строки.

Другое основное изменение заключается в том, что вместо того, чтобы полагаться на OnClickListener в SearchView, который вполне может быть вызван из-за того, что другие слушатели просматривают кражу способности фокусировки.

Используется SearchView's setOnQueryTextListener . Это позволяет передавать текст в SearchClientsData.

Для удобства этот пример использует ArrayAdapter и стандартный макет Simple_List_Item1 и выполняет работу с основным потоком и операциями.

Код активности был: -

public class MainActivity extends AppCompatActivity {

    ListView listviewClients;
    Button btnAll;
    ArrayAdapter mSCA;
    SearchView searchViewclient;
    List<GetSetClientsDetail> listclients;
    DatabaseHelper databaseHelper;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnAll=this.findViewById(R.id.searchallclients);
        listviewClients=this.findViewById(R.id.clients);
        searchViewclient=this.findViewById(R.id.searchclient);
        databaseHelper = new DatabaseHelper(this);
        addSomeData();
        manageListView("");

        searchViewclient.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                manageListView("zzz");
            }
        });
        searchViewclient.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                manageListView(newText);
                return false;
            }
        });

        btnAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                manageListView("");
            }
        });
    }

    private void manageListView(String searchArgument) {
        listclients =  databaseHelper.SearchClientsData(searchArgument);
        if (mSCA == null) {
            mSCA = new ArrayAdapter(this,android.R.layout.simple_list_item_1,listclients);
            listviewClients.setAdapter(mSCA);
        } else {
            mSCA.clear();
            mSCA.addAll(listclients);
            mSCA.notifyDataSetChanged();
        }
    }

    private void addSomeData() {
        databaseHelper.add("Albert","001","123456789","Smith","someone");
        databaseHelper.add("Freda","001","123456789","Jones","someone");
        databaseHelper.add("Mike","002","0987654321","Allenby","him");
    }



    /*
    private void SearchSQliteClientData() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                listclients.clear();
                listclients.addAll(databaseHelper.SearchClientsData());
                return null;
            }

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


    private void getClientFromSqlite() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                listclients.clear();
                listclients.addAll(databaseHelper.getAllClientsData());
                return null;
            }

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

    */
}
  • Метод addSomeData делает, как говорится, добавляет некоторые данные тестирования. Закомментированный код является оригинальным, но неиспользованным кодом.

Результат

При первом запуске (на самом деле не 1-й, а скорее после нескольких запусков, НО только что начатый, отсюда множество данных): -

enter image description here

Набрав a или A и все Майки исчезнут

enter image description here

и т. Д., Список мгновенно корректируется в соответствии с текстом, введенным в поле поиска. При нажатии на кнопку «ВСЕ» все снова отображается.

...