Android SQLite Повторяющиеся элементы - PullRequest
0 голосов
/ 21 марта 2012

У меня проблема с SQLite на Android. Сейчас я извлекаю объект JSON с сервера, анализирую его и помещаю каждый подобъект в таблицу с такими вещами, как имя, Row_ID, уникальный идентификатор и т. Д., Используя этот код:

public void fillTable(Object[] detailedList){
    for(int i=0;i<detailedList.length;++i){
        Log.w("MyApp", "Creating Entry: " + Integer.toString(i));
        String[] article = (String[]) detailedList[i];
        createEntry(article[0], article[1], article[2], article[3], article[4], article[5]);
    }
}

createEntry делает то, на что это похоже. Требуется 6 строк и для записи используется cv.put. Нет проблем.

Однако, когда я пытаюсь заказать их, через:

public String[] getAllTitles(int m){
    Log.w("MyApp", "getTitle1");
    String[] columns = new String[]{KEY_ROWID, KEY_URLID, KEY_URL, KEY_TITLE, KEY_TIME, KEY_TAGS, KEY_STATE};
    Log.w("MyApp", "getTitle2");
    Cursor c = ourDatabase.query(DATABASE_TABLENAME, columns, null, null, null, null, KEY_TIME);
    Log.w("MyApp", "getTitle3");

    String title[] = new String[m];
    Log.w("MyApp", "getTitle4");

    int i = 0;
    int rowTitle = c.getColumnIndex(KEY_TITLE);
    Log.w("MyApp", "getTitle5");

    for(c.moveToFirst();i<m;c.moveToNext()){
        title[i++] = c.getString(rowTitle);
        Log.w("MyApp", "getTitle " + Integer.toString(i));
    }

    return title;
}

Каждая запись на самом деле имеет много дубликатов. Я предполагаю столько дубликатов, сколько раз синхронизировал. Есть ли способ вручную вызвать метод onUpgrade, который удаляет таблицу и создает новую, или лучший способ для удаления дубликатов?

Вторичный вопрос, есть ли способ заказать в обратном порядке? Сейчас я делаю заказ по времени, и самые старые добавленные записи - первые (наименьшее число). Есть ли обратное этому?

1 Ответ

4 голосов
/ 21 марта 2012

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

CREATE TABLE mytable (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,
    theone TEXT UNIQUE ON CONFLICT REPLACE
)

Если вы вставите что-то в эту таблицу, которая уже существует, она удалит строку, в которой уже есть этот элемент, и вставит вашу новую строку.Это также означает, что заменяемая строка получает новый _id (поскольку _id настроен на автоматический рост - вы не должны вставлять этот идентификатор самостоятельно, иначе он не будет работать)

Ваш второй вопрос: вы можете указатьнаправление порядка, если вы добавляете ASC (по возрастанию) или DESC (по убыванию).Вы хотите DESC, вероятно.

Cursor c = ourDatabase.query(DATABASE_TABLENAME, columns, null, null, null, null, KEY_TIME + " DESC");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...