Поиск по двум параметрам в существующей базе

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
ulzaet
Сообщения: 2
Зарегистрирован: 28 июн 2016, 12:06

Поиск по двум параметрам в существующей базе

Сообщение ulzaet » 28 июн 2016, 12:11

Здравствуйте! Прошу Вашей помощи.
Помогите реализовать поиск по двум параметрам и двум полям.
Осуществлен обычный поиск в базе по полям с одним параметром (одно поисковое поле).

Код: Выделить всё

import android.annotation.TargetApi; 
        import android.app.Activity; 
        import android.os.Build; 
        import android.os.Bundle; 

        import android.os.Bundle; 
        import android.support.v7.app.AppCompatActivity; 
        import android.text.Editable; 
        import android.text.TextWatcher; 
        import android.widget.EditText; 
        import android.widget.FilterQueryProvider; 
        import android.widget.ListView; 
        import android.database.Cursor; 
        import android.widget.SimpleCursorAdapter; 
        import java.sql.SQLException; 

public class tram_ extends AppCompatActivity { 

    ListView userList; 
    EditText userFilter; 
    DatabaseHelper sqlHelper; 
    Cursor userCursor; 
    SimpleCursorAdapter userAdapter; 

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

        userList = (ListView)findViewById(R.id.userList); 
        userFilter = (EditText)findViewById(R.id.userFilter); 
        sqlHelper = new DatabaseHelper(getApplicationContext()); 
        sqlHelper.create_db(); 
    } 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override 
    public void onResume(){ 
        super.onResume(); 
        try { 
            sqlHelper.open(); 
            userCursor = sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE, null); 
            String[] headers = new String[]{DatabaseHelper.COLUMN_MAR, DatabaseHelper.COLUMN_OST, DatabaseHelper.COLUMN_TIME,DatabaseHelper.COLUMN_NAPR}; 
            userAdapter = new SimpleCursorAdapter(this, R.layout.my_, 
                    userCursor, headers, new int[]{R.id.textmar, R.id.textost, R.id.texttime, R.id.textnapr}, 0); 
            if(!userFilter.getText().toString().isEmpty()) 
                userAdapter.getFilter().filter(userFilter.getText().toString()); 
            userFilter.addTextChangedListener(new TextWatcher() { 
                public void afterTextChanged(Editable s) { 
                } 
                public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
                } 
                public void onTextChanged(CharSequence s, int start, int before, int count) { 

                    userAdapter.getFilter().filter(s.toString()); 
                } 
            }); 
            userAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
                @Override 
                public Cursor runQuery(CharSequence constraint) { 


                    if (constraint == null || constraint.length() == 0)  { 

                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE, null); 
                    } 
                    else { 

                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE + 
                                        " where " + DatabaseHelper.COLUMN_MAR + " like ?" + " or " + "     " 
                                        + DatabaseHelper.COLUMN_OST + " like ?", 
                                new String[]{"%" + constraint.toString() + "%", "%" + constraint.toString() + "%"}); 
                    } 
                } 
            }); 

            userList.setAdapter(userAdapter); 
        } 
        catch (SQLException ex){} 
    } 

    @Override 
    public void onDestroy(){ 
        super.onDestroy(); 
        // Закрываем подключения 
        sqlHelper.database.close(); 
        userCursor.close(); 
    } 
}  
и сам xml

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:orientation="vertical" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:weightSum="1"> 
    <EditText android:id="@+id/userFilter" android:layout_width="match_parent" 
        android:layout_height="wrap_content" android:ems="10" 
        android:hint="Введите первый параметр" 
        /> 

    <EditText 
        android:id="@+id/editText" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:ems="10" 
        android:hint="Введите второй параметр" /> 

    <ListView 
        android:id="@+id/userList" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:focusable="true" 
        android:focusableInTouchMode="true"> 
    </ListView> 

</LinearLayout>  
Поиск сейчас осуществляется через поле @+id/userFilter в двух полях базы, это text_mar и text_ost, Что бы было понятнее, мне нужен поиск одновременный т. е. расширенный
@+id/userFilter в поле text_mar
а, допустим
@+id/editText в поле text_ost

Можно ли такое вообще реализовать

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Поиск по двум параметрам в существующей базе

Сообщение Sergey777 » 28 июн 2016, 12:54

ulzaet писал(а):Здравствуйте! Прошу Вашей помощи.
Помогите реализовать поиск по двум параметрам и двум полям.
Осуществлен обычный поиск в базе по полям с одним параметром (одно поисковое поле).

Код: Выделить всё

import android.annotation.TargetApi; 
        import android.app.Activity; 
        import android.os.Build; 
        import android.os.Bundle; 

        import android.os.Bundle; 
        import android.support.v7.app.AppCompatActivity; 
        import android.text.Editable; 
        import android.text.TextWatcher; 
        import android.widget.EditText; 
        import android.widget.FilterQueryProvider; 
        import android.widget.ListView; 
        import android.database.Cursor; 
        import android.widget.SimpleCursorAdapter; 
        import java.sql.SQLException; 

public class tram_ extends AppCompatActivity { 

    ListView userList; 
    EditText userFilter; 
    DatabaseHelper sqlHelper; 
    Cursor userCursor; 
    SimpleCursorAdapter userAdapter; 

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

        userList = (ListView)findViewById(R.id.userList); 
        userFilter = (EditText)findViewById(R.id.userFilter); 
        sqlHelper = new DatabaseHelper(getApplicationContext()); 
        sqlHelper.create_db(); 
    } 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override 
    public void onResume(){ 
        super.onResume(); 
        try { 
            sqlHelper.open(); 
            userCursor = sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE, null); 
            String[] headers = new String[]{DatabaseHelper.COLUMN_MAR, DatabaseHelper.COLUMN_OST, DatabaseHelper.COLUMN_TIME,DatabaseHelper.COLUMN_NAPR}; 
            userAdapter = new SimpleCursorAdapter(this, R.layout.my_, 
                    userCursor, headers, new int[]{R.id.textmar, R.id.textost, R.id.texttime, R.id.textnapr}, 0); 
            if(!userFilter.getText().toString().isEmpty()) 
                userAdapter.getFilter().filter(userFilter.getText().toString()); 
            userFilter.addTextChangedListener(new TextWatcher() { 
                public void afterTextChanged(Editable s) { 
                } 
                public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
                } 
                public void onTextChanged(CharSequence s, int start, int before, int count) { 

                    userAdapter.getFilter().filter(s.toString()); 
                } 
            }); 
            userAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
                @Override 
                public Cursor runQuery(CharSequence constraint) { 


                    if (constraint == null || constraint.length() == 0)  { 

                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE, null); 
                    } 
                    else { 

                        return sqlHelper.database.rawQuery("select * from " + DatabaseHelper.TABLE + 
                                        " where " + DatabaseHelper.COLUMN_MAR + " like ?" + " or " + "     " 
                                        + DatabaseHelper.COLUMN_OST + " like ?", 
                                new String[]{"%" + constraint.toString() + "%", "%" + constraint.toString() + "%"}); 
                    } 
                } 
            }); 

            userList.setAdapter(userAdapter); 
        } 
        catch (SQLException ex){} 
    } 

    @Override 
    public void onDestroy(){ 
        super.onDestroy(); 
        // Закрываем подключения 
        sqlHelper.database.close(); 
        userCursor.close(); 
    } 
}  
и сам xml

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:orientation="vertical" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:weightSum="1"> 
    <EditText android:id="@+id/userFilter" android:layout_width="match_parent" 
        android:layout_height="wrap_content" android:ems="10" 
        android:hint="Введите первый параметр" 
        /> 

    <EditText 
        android:id="@+id/editText" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:ems="10" 
        android:hint="Введите второй параметр" /> 

    <ListView 
        android:id="@+id/userList" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:focusable="true" 
        android:focusableInTouchMode="true"> 
    </ListView> 

</LinearLayout>  
Поиск сейчас осуществляется через поле @+id/userFilter в двух полях базы, это text_mar и text_ost, Что бы было понятнее, мне нужен поиск одновременный т. е. расширенный
@+id/userFilter в поле text_mar
а, допустим
@+id/editText в поле text_ost

Можно ли такое вообще реализовать
Здравствуйте. Можно вот пример:

Код: Выделить всё

public void getValueOverColumns(Context context, String categories, String city){
String DATABASE_NAME = "AUTOCITY";
        String TABLE_NAME = "MAPOBJECTS";
        String CATEGORY = "CATEGORY_NAME";
        String CITY = "CITY";
        String TYPE = "STREET_TYPE";
        String STREET = "STREET_NAME";
        String NUMBER = "BUILDING_NUMBER";
        String LATITUDE = "LATITUDE";
        String LONGITUDE = "LONGITUDE";
        String PHONE = "PHONE_NUMBER";
        String MAIL = "EMAIL";
        String WEB = "SITE";
        String TITLE = "TITLE";
        String TIME = "WORKING_HOURS";
        String TEXT = "DESCRIPTION";
        String OTHER = "ADDITIONALLY";
        String IMAGE_ID = "IMAGE_RESOURCE_ID";
        int DATABASE_VERSION = 1;
dbHelper = new Database(context, DATABASE_NAME, null, DATABASE_VERSION);
        SQLiteDatabase sqdb = dbHelper.getWritableDatabase();
 Cursor cursor = sqdb.query(TABLE_NAME, null, CATEGORY + " = ? OR " + CITY + " = ?", new String[] {categories, city}, null, null, null);
if (cursor.getCount() > 0){
while (cursor.moveToNext()){
Log.d(TAG, "id: " + cursor.getString(0) + "\n"
                        + CATEGORY + ": " + cursor.getString(1) + "\n"
                        + CITY + ": " + cursor.getString(2) + "\n"
                        + TYPE + ": " + cursor.getString(3) + "\n"
                        + STREET + ": " + cursor.getString(4) + "\n"
                        + NUMBER + ": " + cursor.getString(5) + "\n"
                        + LATITUDE + ": " + cursor.getString(6) + "\n"
                        + LONGITUDE + ": " + cursor.getString(7) + "\n"
                        + PHONE + ": " + cursor.getString(8) + "\n"
                        + MAIL + ": " + cursor.getString(9) + "\n"
                        + WEB + ": " + cursor.getString(10) + "\n"
                        + TITLE + ": " + cursor.getString(11) + "\n"
                        + TIME + ": " + cursor.getString(12) + "\n"
                        + TEXT + ": " + cursor.getString(13) + "\n"
                        + OTHER + ": " + cursor.getString(14) + "\n"
                        + IMAGE_ID + ": " + cursor.getString(15) + "\n"
                        + "---------------------------------------" + "\n");
}
            cursor.close();
            sqdb.close();
            dbHelper.close();
} else {
            cursor.close();
            sqdb.close();
            dbHelper.close();
}
}
По двум пришедшим параметрам в двух полях (CATEGORY_NAME и CITY) таблицы БД выводим все значения столбцов в таблице. Я надеюсь что правильно понял Ваш вопрос))

ulzaet
Сообщения: 2
Зарегистрирован: 28 июн 2016, 12:06

Re: Поиск по двум параметрам в существующей базе

Сообщение ulzaet » 28 июн 2016, 14:04

Да вроде то, а как привязать текстовое поле? )) я вот никак не врублюсь...

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Поиск по двум параметрам в существующей базе

Сообщение Sergey777 » 28 июн 2016, 15:42

ulzaet писал(а):Да вроде то, а как привязать текстовое поле? )) я вот никак не врублюсь...
Изменяйте параметры в этой строке под Ваши:

Код: Выделить всё

Cursor cursor = sqdb.query(TABLE_NAME, new String[] {columns}, CATEGORY + " = ? OR " + CITY + " = ?", new String[] {categories, city}, null, null, null);
В чём проблема? Или вы не знаете как преобразовать данные из EditText в String?

Код: Выделить всё

Cursor cursor = sqdb.query(TABLE_NAME, new String[] {columns}, CATEGORY + " = ? OR " + CITY + " = ?", new String[] {editText1.getText().toString(), editText2.getText().toString()}, null, null, null);

Ответить