2012-03-20 7 views
0

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

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, который отбрасывает таблицу и создает новую, или лучший способ очистить дубликаты?

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

ответ

4

Если вы не хотите дублировать в одном столбце, создайте этот столбец с ключевым словом 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"); 
+0

Спасибо. Ранее я видел тег «desc», но это было для людей, реализующих другие классы SQL, чем я. Благодаря! –