2016-05-26 4 views
1

В моем приложении я могу повторно отсортировать позицию строк ListView путем перетаскивания & drop и сохранить новый порядок строк в базе данных. ListView Показывает содержимое ArrayList определяется следующим образом:Android ContentValues ​​weird Из-за удаления области

ArrayList<ContentValues> lstBat; 

и заполняются из базы данных SQLite. После заполнения списка я добавляю некоторые значения в «ContentValues», которые я использую в адаптере Array.

Проблема возникает в методе re_sort после выполнения «dbTools.updateBat (cv)».

public void re_sort() { 
    int lines= lstBat.size(); 
    ContentValues cv=null; 
    for (int i = 0; i < lines; i++) { 
     cv = lstBat.get(i); //get row's cv 
     cv.put("order", i); //Assign new order 
     dbTools.updateBat(cv); //Store new order in the list 
     lstBat.set(i, cv); 
    } 
} 

значений «состояние», «значок» и «дата» более не в локальной переменной «сорта» (ContentValues), они были удалены слишком !!!!!

метод updateBat определен в классе DBTools

public int updateBat (ContentValues cv){ 
    SQLiteDatabase database = this.getWritableDatabase(); 
    cv.remove("state"); //Not a column of the table 
    cv.remove("icon"); //Not a column of the table 
    cv.remove("date"); //Not a column of the table 
    return database.update(TABLE_bat, cv, "batId"+"=?", new String[]{cv.getAsString("batId")}); 
} 

И это обходной путь:

public void re_sort() { 
    int lines= lstBat.size(); 
    long date=0; 
    String state=""; 
    int icon=0; 
    ContentValues cv=null; 
    for (int i = 0; i < lines; i++) { 
     cv = lstBat.get(i); 
     date=cv.getAsLong("date"); 
     icon=cv.getAsInteger("icon"); 
     state=cv.getAsString("state"); 
     cv.put("order", i); 
     dbTools.updateBat(cv); 
     cv.put("state",state); 
     cv.put("icon",icon); 
     cv.put("date",date); 
     lstBat.set(i, cv); 
    } 
} 

Если я закомментировать dbTools.updateBat (резюме) значения сохраняются, и, конечно, база данных не будет обновляться.

Почему они были удалены, если они вышли из сферы действия?

+0

Почему вы вызываете cv.remove («state») ;? –

ответ

0

Если я правильно понимаю ваш код, его поведение кажется вполне нормальным.

От вашего метода re_sort вы передаете объект cv методу updateBat. Все параметры объекта в Java передаются по ссылке, поэтому cv НЕ является копией исходного объекта. Если вы хотите передать копию своего объекта ContentValues, вы должны создать клон. Что-то вроде этого:

public void re_sort() { 
    int lines= lstBat.size(); 
    ContentValues cv=null; 
    for (int i = 0; i < lines; i++) { 
     cv = lstBat.get(i); //get row's cv 
     cv.put("order", i); //Assign new order 
     dbTools.updateBat(new ContentValues(cv)); //Store new order in the list, by passing a new ContentValues object 
     lstBat.set(i, cv); 
    } 
} 
Смежные вопросы