2013-05-27 5 views
5

У меня есть приложение для Android, которое должно заменить родные контакты Android.Как сортировать по имени и фамилии в строке поиска - Sqlite

Я хочу добавить пользователю возможность поиска пользователя на основе ограничения характера.

Например:

это мои контакты таблица:

id firstName lastName 
1. Smith  Jean 
2. allen  carr 
3.    zetter 
4. john  Stewart 
5. Smith  Allen 
6. Smith  Davey 
7.    Smitten 
8. barney  saltzberg 

Если пользователь вводит символ 's', я хочу дать ему все контакты statrting с «s» в их имени ИЛИ фамилию, отсортированную по первому имени, а затем фамилию. Из таблицы до того, как результат я хочу получить это:

id firstName lastName 
1. Smith  Allen 
2. Smith  Davey 
3. Smith  Jean 
4. barney  saltzberg 
4.    Smitten 
5. john  Stewart 

UPDATE: Проблема заключается в том, когда первое имя равно NULL, сортировка не работает, и строка показала, прежде чем он должен. Я пробовал ответ marcin, и это дает мне неправильный результат.

Я попробовал следующее:

  1. выбора String = PeopleDataBase.COLUMN_FIRST_NAME + "LIKE«" + ограничение + "% 'или "+ PeopleDataBase.COLUMN_LAST_NAME +" LIKE'" + ограничение +«%» «;

    Курсор cur = db.query (PeopleDataBase.TABLE_PEOPLE, null, selection, null, null, null, null);

Я думал, что для достижения этой цели с помощью двух различных запросов, по одному для имени и один для фамилии, а затем объединить их в один курсор, но я уверен, что есть лучшее решение.

ОБНОВЛЕНИЕ: Я также попытался сортировать следующим образом без успеха.

Cursor cur = db.query(PeopleDataBase.TABLE_PEOPLE, null, selection, null, null, null, PeopleDataBase.COLUMN_FIRST_NAME + "," + PeopleDataBase.COLUMN_LAST_NAME); 

У вас есть лучшее решение?

+0

Привет всем, ответы еще не помогли мне. Я думаю, что я сделаю это с трудом, два разных вопроса, а затем объединить ответы. –

ответ

2

как вы показываете контакты? в списке?

другая идея заключается в том, чтобы загрузить все данные в виде списка, и чем вы можете отфильтровать список

вы можете создать собственный Listview и реализовать Фильтруемые

public class YourContactsListAdapter extends BaseAdapter implements Filterable { 
    //some methodes to override 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence c) {} 
@Override 
      protected void publishResults(CharSequence charSequence, FilterResults filterResults) {} 
} 
} 

может быть, самый простой, но не самый лучший путь .. Надеюсь, я не совсем понял вопрос.

// EDIT:

попытка CursorAdapter не BaseAdapter вот пример ... http://tausiq.wordpress.com/2012/08/22/android-list-view-from-database-with-cursor-adapter/

1

случае, когда MyDate имеет значение null, а затем еще 1 конец PeopleDataBase.COLUMN_FIRST_NAME + ", " + PeopleDataBase.COLUMN_LAST_NAME, поскольку последний параметр db.query (вместо null) должен работать.

EDIT: если вы хотите, нулевые значения, чтобы быть последним вы должны следовать: SQL how to make null values come last when sorting ascending

а именно:

Cursor cur = db.query(PeopleDataBase.TABLE_PEOPLE, null, selection, null, null, null, 
    "case when " + PeopleDataBase.COLUMN_FIRST_NAME + " is null then 1 else 0 end," 
    + PeopleDataBase.COLUMN_FIRST_NAME + "," 
    + "case when " + PeopleDataBase.COLUMN_LAST_NAME+ " is null then 1 else 0 end," 
    + PeopleDataBase.COLUMN_LAST_NAME); 
+0

Я попробовал - «Я также попытался отсортировать файл PeopleDataBase.COLUMN_FIRST_NAME, PeopleDataBase.COLUMN_LAST_NAME без успеха». –

+0

и что было результатом запроса: 'db.query (PeopleDataBase.TABLE_PEOPLE, null, selection, null, null, null, PeopleDataBase.COLUMN_FIRST_NAME +", "+ PeopleDataBase.COLUMN_LAST_NAME);'? – marcin

+0

Проблема в том, что он дает мне контакт с фамилией только до первого имени в этом клише. –

1

Вы пробовали с ORDER BY:

String selection = 
PeopleDataBase.COLUMN_FIRST_NAME + " LIKE '" + constraint + "%' OR " + 
PeopleDataBase.COLUMN_LAST_NAME + " LIKE '" + constraint + "%'" ORDER BY " + 
PeopleDataBase.COLUMN_FIRST_NAME + " ASC, " + PeopleDataBase.COLUMN_LAST_NAME + " ASC"; 
1

TL ; DR

Я не думаю, что это i легко. Рассматривайте расслабление ваших требований.

последовательность пользовательских параметров сортировки

Если установка пользовательских параметров сортировки последовательности в Android были легко возможно, вам нужно только реализовать последовательность сортировки, которая делает null равного любое значения. Тем не менее, установка последовательностей сортировки невозможна с использованием Java Java API sqlite.

Альтернативные проблемы

Вы можете изменить вашу проблему?

  • Было бы приемлемым, чтобы нулевые имена сначала сортировались в порядке очереди? Тогда запрос может быть что-то вдоль линий

    select * from contacts 
        where firstname like 's%' or lastname like 's%' 
        order by 
        case when firstname like 's%' then 0 else 1 end, 
        firstname collate nocase, 
        lastname collate nocase; 
    

    Здесь первые order by выражение сортирует ли соответствует первое имя или нет, а затем по имени и фамилии.

  • Что-то еще, чтобы решить эту проблему проще?

Тестирование

Во-первых, давайте подготовим sqlite3 песочницу:

sqlite> create table contacts(id integer primary key, firstname text, lastname text); 
sqlite> insert into contacts values(1,'Smith','Jean'); 
sqlite> insert into contacts values(2,'allen','carr'); 
sqlite> insert into contacts values(3,null,'zetter'); 
sqlite> insert into contacts values(4,'john','Stewart'); 
sqlite> insert into contacts values(5,'Smith','Allen'); 
sqlite> insert into contacts values(6,'Smith','Davey'); 
sqlite> insert into contacts values(7,null,'Smitten'); 
sqlite> insert into contacts values(8,'barney','saltzberg'); 
sqlite> .head on 

Обратите внимание, что вы получите пример результатов вы попросили просто сортировать по LastName:

sqlite> select * from contacts where firstname like 's%' or lastname like 's%' order by lastname collate nocase; 
id|firstname|lastname 
5|Smith|Allen 
6|Smith|Davey 
1|Smith|Jean 
8|barney|saltzberg 
7||Smitten 
4|john|Stewart 

Очевидно, что это не то, что вы хотите, поэтому давайте добавим еще несколько тестовых данных в песочницу:

sqlite> insert into contacts values(9,'see','this'); 
sqlite> select * from contacts where firstname like 's%' or lastname like 's%' order by lastname collate nocase; 
id|firstname|lastname 
5|Smith|Allen 
6|Smith|Davey 
1|Smith|Jean 
8|barney|saltzberg 
7||Smitten 
4|john|Stewart 
9|see|this 

Теперь с этой дополнительной строкой тестовых данных, альтернативное решение проблемы упоминалась выше, будет возвращать:

sqlite> select * from contacts where firstname like 's%' or lastname like 's%' order by  case when firstname like 's%' then 0 else 1 end, firstname collate nocase, lastname collate nocase; 
id|firstname|lastname|sortorder 
9|see|this| 
5|Smith|Allen| 
6|Smith|Davey| 
1|Smith|Jean| 
7||Smitten| 
8|barney|saltzberg| 
4|john|Stewart| 
1

Для «желательного» Результатов примера вы дали, это кажется, что это будет делать что вы спрашиваете:

SELECT * FROM contacts 
    WHERE lastname LIKE 's%' OR firstname LIKE 's%' 
    ORDER BY LOWER(lastname), UPPER(firstname); -- rudimentary namesorts via "casing" 

sqlite> select * from contacts where lastname like 's%' or firstname like 's%' 
order by lower(lastname), upper(firstname); 
16|sadie|| 
13|Sarah|| 
11|sue|| 
5|Smith|Allen| 
6|Smith|Davey| 
1|Smith|Jean| 
10||Saltzberg| 
9|Arney|saltzberg| 
8|barney|saltzberg| 
14|Carnie|Saltzberg| 
7||Smitten| 
12|Sally|smitten| 
4|john|Stewart| 
15|Jon|stewart| 
sqlite> 
Смежные вопросы