Форум программистов, компьютерный форум CyberForum.ru

Значение в БД не изменяется - Android

Восстановить пароль Регистрация
 
TanaTiX
Модератор
 Аватар для TanaTiX
2731 / 1576 / 144
Регистрация: 19.02.2011
Сообщений: 5,658
11.09.2016, 13:46     Значение в БД не изменяется #1
При клике по кнопке должны вноситься изменения в локальную БД, что сразу должно отразиться на экране.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.tanatix.checkinternetresourceschanges;
 
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.List;
 
/**
 * Created by TanaTiX on 28.08.2016.
 */
public class ResourceListAdapter extends ArrayAdapter<Resource> {
 
    private UpdateController controller = new UpdateController();
    private List<Resource> list = null;
 
    public ResourceListAdapter(Context context, List<Resource> list){
        super(context, R.layout.list_item_main, list);
        this.list = list;
        setNotifyOnChange(true);
    }
    static class ViewHolder{
        protected Button button;
        protected TextView name;
        protected TextView html;
        protected TextView date;
        protected TextView root;
        protected TextView link;
    }
 
    @Override
    public View getView(final int position, View convertView, ViewGroup parent){
        Log.w("adapter", "getView update");
        final Resource resource = getItem(position);
 
        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_main, null);
        }
        final ViewHolder viewHolder = new ViewHolder();
 
        viewHolder.name = (TextView)convertView.findViewById(R.id.name);
        viewHolder.date = (TextView)convertView.findViewById(R.id.date);
        viewHolder.root = (TextView)convertView.findViewById(R.id.root);
        viewHolder.link = (TextView)convertView.findViewById(R.id.link);
        viewHolder.html = (TextView)convertView.findViewById(R.id.html);
        viewHolder.button = (Button)convertView.findViewById(R.id.updateResourceButton);
 
        viewHolder.name.setText(resource.get_name());
        viewHolder.root.setText(resource.get_root());
        viewHolder.link.setText(resource.get_link());
        viewHolder.html.setText(resource.get_html());
        //viewHolder.html.setText(Integer.toString(resource.get_id()));
        Log.w("list adapter", "constructor " + resource);
 
 
        if(resource.get_update() == DatabaseHelper.UP_PROGRESS || resource.get_update() == DatabaseHelper.UP_WAIT){
            viewHolder.button.setClickable(false);
            viewHolder.button.setText("locked");
        }else{
            viewHolder.button.setClickable(true);
            viewHolder.button.setText("update");
        }
 
        viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);//происходит изменение одного int значения
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                db.updateData(resource, data);
 
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }
 
}
Ошибок никаких нет. Почему не происходят изменения не понятно. Впечатление, что упускаю что-то простое. Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2016, 13:46     Значение в БД не изменяется
Посмотрите здесь:

Не изменяется стиль текста Android
Android Переданное значение REQUEST_LOGIN = 1 возвращает другое значение
Android Цвет шрифта изменяется не только у нажатого дочернего элемента но и у др. доч. элементов в соседних группах
Не изменяется текст в TextView Android
Иконка приложения не изменяется Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
REALIST07
Автор FAQ
Автор FAQ
 Аватар для REALIST07
174 / 174 / 13
Регистрация: 11.06.2010
Сообщений: 932
11.09.2016, 14:27     Значение в БД не изменяется #2
1) Можно попробовать переопределить обновление списка:
Java
1
2
3
4
@Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
2) Можно попробовать вынести логику за пределы адаптера, и обновлять список непосредственно в Activity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private View.OnClickListener listener = null;
public ResourceListAdapter(Context context, List<Resource> list,View.OnClickListener listener){
        super(context, R.layout.list_item_main, list);
        this.list = list;
        this.listener = listener;
        setNotifyOnChange(true);
    }
 
 
viewHolder.button.setOnClickListener(listener);
        return convertView;
    }
 
// а это объявить в активити и передавать в конструктор
View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);//происходит изменение одного int значения
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                db.updateData(resource, data);
 
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
            }
        };
3) Если это все не помогает, то можно унаследоваться не от ArrayAdapter,а от BaseAdapter, если вы выбираете этот вариант,то вам нужно будет вручную добавлять методы модификации, напишите мне об этом, если надумаете, если вам это нужно и я выдерну код с рабочего проекта на продакшне, удачи!
TanaTiX
Модератор
 Аватар для TanaTiX
2731 / 1576 / 144
Регистрация: 19.02.2011
Сообщений: 5,658
12.09.2016, 08:30  [ТС]     Значение в БД не изменяется #3
REALIST07, спасибо за отзыв, но похоже дело не в обновлении списка, а в изменении данных в БД. Пока сам покумекаю, не получится - отпишусь.

Добавлено через 51 минуту
Да, тема названа не совсем корректно.
В общем данные не изменяются
Собственно обработчик клика, в котором должно запускать обновление записи.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                Log.w(">>>adapter", ""+list);
                db.updateData(resource, data);
                Log.w(">>>adapter", ""+list);
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
                //Log.w(">>>adapter", ""+list);
            }
        });
И метод, в котором происходит обновление (при этом значение countChanges становится равным 1)
Java
1
2
3
4
5
6
7
8
public void updateData(Resource resource, ContentValues values){
        Log.w("update item", "id: "+BaseColumns._ID + " old value ");
        db = this.getWritableDatabase();
        int countChanges = db.update(DATABASE_TABLE, values, BaseColumns._ID + "= ?", new String[]{Integer.toString(resource.get_id())});
        //int countChanges = db.update(DATABASE_TABLE, values, BaseColumns._ID + "= " + resource.get_id() , null);
        Log.w("update item", "id: "+BaseColumns._ID + " new value " + countChanges);
 
    }
И еще фрагмент
Java
1
 public static final int UP_PROGRESS = 2;
Нужное поле в БД по умолчанию имеет 0.
Вроде делаю все по написанному в уроках, но в консоль выходят не обновленные данные. Куда копать?

Добавлено через 13 часов 30 минут
Все еще актуально. Хотя бы направление.
vxg
Модератор
 Аватар для vxg
2718 / 1729 / 171
Регистрация: 13.01.2012
Сообщений: 6,478
12.09.2016, 08:46     Значение в БД не изменяется #4
TanaTiX, изменится должен только тот элемент на котором вы кликнули или другой? Если тот же - просто устанавливайте значения прямо в обработчике. Чтобы обработчик знал чей он храните холдер в теге кнопки
TanaTiX
Модератор
 Аватар для TanaTiX
2731 / 1576 / 144
Регистрация: 19.02.2011
Сообщений: 5,658
12.09.2016, 10:55  [ТС]     Значение в БД не изменяется #5
vxg, нет, я думал, что проблема в изменении, а дело оказалось в том, что значение в БД не изменяется (по хорошему можно было бы тему переименовать). А БД нужно в любом случае менять. В доках читаю, что у меня все должно шуршать правильно, а включаешь - не работает.
Yandex
Объявления
12.09.2016, 10:55     Значение в БД не изменяется
Ответ Создать тему
Опции темы

Текущее время: 21:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru