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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
#1

SQLite and ListView. Ввод и вывод данных - Программирование Android

12.04.2015, 21:15. Просмотров 3512. Ответов 53
Метки нет (Все метки)

Здравствуйте. Пишу программу(кто бы мог подумать). Есть подозрения, что данные в БД вбиваются не правильно или как раз выводятся неправильно. Этого ни как всё не пойму.Собственно код:
Вывод данных в лог с помощью кнопки из таблицы, что в БД.
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
 btnEvent  = (Button) findViewById(R.id.log_log_log);
        btnEvent.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
 
                Log.d(TAG, "--- Rows in event: ---");
                // делаем запрос всех данных из таблицы , получаем Cursor
                //Cursor c = db.query("event", null, null, null, null, null, null);
                Cursor c = db.getAllData("event");
 
                if (c.moveToFirst()) {
                    int idColID = c.getColumnIndex(DB.EVENT_COLUMN_ID);
                    int idColMAN = c.getColumnIndex(DB.EVENT_COLUMN_MAN);
                    int idColMEETING = c.getColumnIndex(DB.EVENT_COLUMN_MEETING);
                    int idColET = c.getColumnIndex(DB.EVENT_COLUMN_EVENT_TYPE);
                    int idColVALUE = c.getColumnIndex(DB.EVENT_COLUMN_VALUE);
 
                    do {
                        // получаем значения по номерам столбцов и пишем все в лог
                        Log.d(TAG,
                                "ID = " + c.getInt(idColID) +
                                        ", MAN = " + c.getInt(idColMAN) +
                                        ", MEETING = " + c.getInt(idColMEETING) +
                                        ", EVENT TYPE = " + c.getInt(idColET) +
                                        ", VALUE = " + c.getInt(idColVALUE));
                        // переход на следующую строку
                        // а если следующей нет (текущая - последняя), то false - выходим из цикла
                    } while (c.moveToNext());
                } else {
                    Log.d(TAG, "0 rows");
                }
                    }
        });
Лог после вывода:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
D/EVENT__ACTIVITY﹕ --- Rows in event: ---
D/EVENT__ACTIVITY﹕ ID = 1, MAN = 1, MEETING = 0, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 2, MAN = 0, MEETING = 1, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 3, MAN = 0, MEETING = 0, EVENT TYPE = 1, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 4, MAN = 0, MEETING = 0, EVENT TYPE = 0, VALUE = 1
D/EVENT__ACTIVITY﹕ ID = 5, MAN = 1, MEETING = 0, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 6, MAN = 0, MEETING = 1, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 7, MAN = 0, MEETING = 0, EVENT TYPE = 1, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 8, MAN = 0, MEETING = 0, EVENT TYPE = 0, VALUE = 1
D/EVENT__ACTIVITY﹕ ID = 9, MAN = 1, MEETING = 0, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 10, MAN = 0, MEETING = 1, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 11, MAN = 0, MEETING = 0, EVENT TYPE = 1, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 12, MAN = 0, MEETING = 0, EVENT TYPE = 0, VALUE = 1
D/EVENT__ACTIVITY﹕ ID = 13, MAN = 2, MEETING = 0, EVENT TYPE = 0, VALUE = 0
D/EVENT__ACTIVITY﹕ ID = 14, MAN = 0, MEETING = 2, EVENT TYPE = 0, VALUE = 0
И так далее.

Фишка в том, что добавляются 4 интовых значения, а при выводе получается не одна строка, а четыре и некой лесенкой, можно увидеть:
11000
20100
30010
40001
Как-то так. Запихнул это на вывод в ListView, но там тоже ни чего хорошего вывод цифры происходит через каждые три строчки.

Добавление в данных в таблицу
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
 btnEvent  = (Button) findViewById(R.id.new_event_in_tab);
        btnEvent.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Do something in response to button click
 
 
                boolean checkMan= !true,
                        checkET = !true,
                        checkMeet = !true;
 
                Log.v(TAG, "ТЫК!" );
 
                //checkMan = !true; checkET = !true; checkMeet = !true;
 
                Log.v(TAG, "РАБОТАЕ СО СПИНЕРАМИ" );
                if (edtMan.getSelectedItem() != null)
                {
                    checkMan = true;
 
                    cur = db.GetCatalogValueByName("man", "_id", "name", edtMan.getSelectedItem().toString());
                    cManID = cur.getInt(cur.getColumnIndex("_id"));
                }
                if (edtET.getSelectedItem() != null)
                {
                    checkET = true;
                    cur = db.GetCatalogValueByName("event_type", "_id", "name", edtET.getSelectedItem().toString());
                    cETID = cur.getInt(cur.getColumnIndex("_id"));
                    //db.addRec("event", DB.EVENT_COLUMN_EVENT_TYPE, cETID );
                }
                if (edtMeet.getSelectedItem() != null)
                {
                    checkMeet = true;
                    cur = db.GetCatalogValueByName("meeting", "_id", "name", edtMeet.getSelectedItem().toString());
                    cMeetID = cur.getInt(cur.getColumnIndex("_id"));
                    //db.addRec("event", DB.EVENT_COLUMN_MEETING, cMeetID );
                }
 
                Log.v(TAG, "ПРОВЕРЯЕМ ФЛАГИ НА 'TRUE'. ИМЕЮТСЯ ЛИ ДАННЫЕ В СПИНЕРАХ " );
 
                //Если все значения true, то записываем данные в таблицу "event"
                if(checkMan != false & checkET != false & checkMeet != false){
                    db.addRec("event", "ManId", cManID );
                    db.addRec("event", "MeetingId", cMeetID );
                    db.addRec("event", "EventTypeId", cETID );
                    Log.v(TAG, "ОК" );
 
                    Log.v(TAG, "ЗАПИСЬ В ТАБЛИЦУ ЧЕКБОКСИКА" );
                    if (checkboxEvent.isChecked() == true) {
                        db.addRec("event", DB.EVENT_COLUMN_VALUE, 1 );
                        Log.v(TAG, "ОК---1" );
 
                    }else {
                        db.addRec("event", DB.EVENT_COLUMN_VALUE, 0 );
                        Log.v(TAG, "ОК---0" );
                    }
                }
            }
        });
В заранее спасибо за вашу помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
13.04.2015, 08:04     SQLite and ListView. Ввод и вывод данных #2
db.addRec смотрите, оно добавляет записи, а не обновляет.
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
13.04.2015, 13:09  [ТС]     SQLite and ListView. Ввод и вывод данных #3
Rube, но ведь всё верно, мне и нужно добавить запись, а потом вывести
Java
1
2
3
4
5
6
7
8
9
10
11
12
// добавить запись в TABLE
    public void addRec(String name_table, String name_column, String txt) {
        ContentValues cv = new ContentValues();
        cv.put(name_column, txt);
        mDB.insert(name_table, null, cv);
    }
    //Перегружение функции(для int)
    public void addRec(String name_table, String name_column, int txt) {
        ContentValues cv = new ContentValues();
        cv.put(name_column, txt);
        mDB.insert(name_table, null, cv);
    }
То есть мне нужно новую функцию для этого, что бы всё записывалось в одну строку? Это нужно будет делать по id?
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
13.04.2015, 13:52     SQLite and ListView. Ввод и вывод данных #4
Naomis, конечно же, insert добавляет строку, а вам нужно в одну строку вставить 4 поля.
Делайте 4 put и один insert.
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
13.04.2015, 17:11  [ТС]     SQLite and ListView. Ввод и вывод данных #5
Rube, понял, спасибо.
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
13.04.2015, 17:37     SQLite and ListView. Ввод и вывод данных #6
Цитата Сообщение от Naomis Посмотреть сообщение
boolean checkMan= !true, checkET = !true, checkMeet = !true;
Java
1
2
3
boolean checkMan= false;
boolean checkET = false;
boolean checkMeet = false;
Цитата Сообщение от Naomis Посмотреть сообщение
if(checkMan != false & checkET != false & checkMeet != false){
Java
1
if(checkMan && checkET && checkMeet)
Цитата Сообщение от Naomis Посмотреть сообщение
if (checkboxEvent.isChecked() == true) {
Java
1
if (checkboxEvent.isChecked()){

Несколько поправок
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
13.04.2015, 17:44  [ТС]     SQLite and ListView. Ввод и вывод данных #7
YuraAAA, а это очень критично? Для лучшей читабельности?
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
13.04.2015, 18:00     SQLite and ListView. Ввод и вывод данных #8
Скорее для грамотности
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
13.04.2015, 19:34  [ТС]     SQLite and ListView. Ввод и вывод данных #9
Rube, понял, сей час всё поправим.

Добавлено через 1 час 19 минут
Rube, YuraAAA, господа, всё поправил, получилось. Спасибо.

Есть ещё вопрос. Нужно выводить на экран по средству ListView. Вывожу, но криво и неправильно. на данный момент вывожу цифры из 4-й таблицы, просто чтобы заставить работать вывод правильно. На данный момент есть ListView, который выводит данные первого столбца таблицы, а нужно выводить все. Вопрос: Нужно создать собственный ListView, то есть кастомизировать его под себя? Использовать обычный ListView, но передавать данные строкой, то есть записать данные в массив, в каждую ячейку массива данные из БД, и передавать ListView? Для меня проблема, так-как не до конца разобрался с ListView.

В конечном итоге да ListView должны быть данные из 3-х таблиц("man", "event_type", "meeting"), так как 4-я таблица ("event") содержит в себе id на данные в предыдущех 3-х таблицах.

Стандартный ListView в xml
XML
1
2
3
4
5
    <ListView
        android:id="@+id/lvDataEvent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
Создание списка. Использовал интернет пример, чтобы хоть как-то работало.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
Cursor forEvList = db.getAllData("event");
        startManagingCursor(forEvList);
 
        ListView lvEvent = (ListView)findViewById(R.id.lvDataEvent);
 
        // формируем столбцы сопоставления
        String[] from = new String[] { DB.EVENT_COLUMN_MAN };
        int[] to = new int[] { R.id.tvText };
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, forEvList, from, to);
        lvData = (ListView) findViewById(R.id.lvDataEvent);
        lvData.setAdapter(scAdapter);
Таблица "event" имеет такие столбцы:
Java
1
2
3
4
5
6
7
        //event
    private static final String EVENT_TABLE = "event";
    public static final String EVENT_COLUMN_ID = "_id";
    public static final String EVENT_COLUMN_MAN = "ManId";
    public static final String EVENT_COLUMN_MEETING = "MeetingId";
    public static final String EVENT_COLUMN_EVENT_TYPE = "EventTypeId";
    public static final String EVENT_COLUMN_VALUE = "Value";
В заранее спасибо.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.04.2015, 07:44     SQLite and ListView. Ввод и вывод данных #10
ListView не достаточно, надо ему скармливать отдельную вьюху (т.е. строку), на жаргоне - 'итем'.
Сразу учитесь делать кастомный адаптер, основанный на курсоре: урок
Для получения данных надо составить SQL-запрос.
Цитата Сообщение от Naomis Посмотреть сообщение
так как 4-я таблица ("event") содержит в себе id на данные в предыдущех 3-х таблицах
Мне кажется, что логику бд надо оптимизировать.
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
14.04.2015, 19:36  [ТС]     SQLite and ListView. Ввод и вывод данных #11
Rube, в смысле оптимизировать, что вы предложите? Какие нарекания?

Также есть вопрос. Что за столбцы сопоставления? В одном массиве мы передаём список из БД,а во втором что? Хоть я эту конструкцию и использую, но не до конца понимаю для чего и как она работает. И почему нельзя обойтись одним массивом?
Java
1
2
3
// формируем столбцы сопоставления
    String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
    int[] to = new int[] { R.id.ivImg, R.id.tvText };
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.04.2015, 20:00     SQLite and ListView. Ввод и вывод данных #12
Оптимизировать в смысле логику БД в порядок привести, а то
Цитата Сообщение от Rube Посмотреть сообщение
4-я таблица ("event") содержит в себе id на данные в предыдущех 3-х таблицах
наводит на мысль, что что-то не так. Объясните что программа делает.
Цитата Сообщение от Naomis Посмотреть сообщение
Что за столбцы сопоставления?
String[] from - массив данных из столбцов БД.
int[] to - id вьюх, куда вставляем из from.
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
14.04.2015, 20:26  [ТС]     SQLite and ListView. Ввод и вывод данных #13
Rube, программа учёта студентов, дипломная работа моя. В первой таблице список имён, во второй список встреч(лабораторная, лекция, зачёт и тд), третья список событий происходящих в на встречах(отвечал, сдал дз, пил, курил, разговаривал и тд) и чекбоксик "Свершилось". Первые три активити добавляю\удаляют данные из первых трёт таблиц БД, а 4 активити собирает данные из трёх данных, пихает их в спиннеры(выпадающие списки) при "тыке" кнопки добавляет id трёх предыдущих таблиц в 4 таб. , что бы после выводить на экран. Далее в разработке предвидятся сортировки, проверки на повторы ввод. данных и некоторые другие плюшки.

Как-то так.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.04.2015, 21:19     SQLite and ListView. Ввод и вывод данных #14
Как то так.
1 таблица. Студенты - id_st, ФИО и другие константы.
2 таблица. Встречи - id_v, Название встречи
3 таблица - События - id_sb, Название события
4 таблица - Действия - id_st, id_v, id_sb, дата_время
Допустим 3 студента пришли на юбилей. 2 из них пили-курили, а 3-й разговаривал (болтун). Вот тебе 3 записи в т. Действия. Чекбоксиков "Свершилось" не надо в таком случае, т.к. т. Действия оно и есть.
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
14.04.2015, 21:30  [ТС]     SQLite and ListView. Ввод и вывод данных #15
Rube, но ведь примерно так и есть.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
15.04.2015, 08:48     SQLite and ListView. Ввод и вывод данных #16
Ну если так и есть, тогда дело за малым
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
16.04.2015, 18:01  [ТС]     SQLite and ListView. Ввод и вывод данных #17
Ни как не могу разобраться с ListView, то есть с выводом данных на экран.

сам layot для активити
activity_event.xml
XML
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <Spinner
        android:id="@+id/ManSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:spinnerMode="dialog" >
    </Spinner>
    <Spinner
        android:id="@+id/ETSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:spinnerMode="dialog">
    </Spinner>
    <Spinner
        android:id="@+id/MeetingSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:spinnerMode="dialog">
    </Spinner>
 
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/CheckBox"
        android:id="@+id/checkBox" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/new_event_in_tab"
        android:id="@+id/new_event_in_tab"
        android:layout_gravity="center_horizontal"
        android:singleLine="true" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Вывести данные в лог"
        android:id="@+id/log_log_log"
        android:layout_gravity="center_horizontal"
        android:singleLine="true" />
 
    <ListView
        android:id="@+id/lvDataEvent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
 
</LinearLayout>
Ещё один layout для кастомизации ListView
item_ev.xml
XML
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:text=""
        android:textSize="18sp">
    </TextView>
    <TextView
        android:id="@+id/tvText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:text=""
        android:textSize="18sp">
    </TextView>
    <TextView
        android:id="@+id/tvText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:text=""
        android:textSize="18sp">
    </TextView>
    <TextView
        android:id="@+id/tvText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:text=""
        android:textSize="18sp">
    </TextView>
 
</LinearLayout>
А здесь в самой активити EventActivity.java в onCreate пытаюсь вкинуть данные в ListView.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// формируем столбцы сопоставления
        String[] from = new String[] { DB.EVENT_COLUMN_MEETING,
                                       DB.EVENT_COLUMN_MAN,
                                       DB.EVENT_COLUMN_EVENT_TYPE,
                                       DB.EVENT_COLUMN_VALUE};
        int[] to = new int[] { R.id.tvText,
                               R.id.tvText1,
                               R.id.tvText2,
                               R.id.tvText3};
 
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item_ev, null, from, to, 0);
        lvDataEvent = (ListView) findViewById(R.id.lvDataEvent);
        lvDataEvent.setAdapter(scAdapter);
Подозреваю, что что-то не так. Список просто не выводится, его будь-то бы нет...
Rube, пытаюсь делать по тому уроку, но что-то подвох я чую. и не понимаю разницы между CursorLoader и Cursor. В чём фишка?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.04.2015, 20:40     SQLite and ListView. Ввод и вывод данных #18
Цитата Сообщение от Naomis Посмотреть сообщение
Подозреваю, что что-то не так. Список просто не выводится, его будь-то бы нет..
Так, а чё курсор null-то?
Откуда адаптеру данные взять-то?
Naomis
6 / 6 / 1
Регистрация: 11.03.2015
Сообщений: 210
Завершенные тесты: 1
16.04.2015, 20:53  [ТС]     SQLite and ListView. Ввод и вывод данных #19
Armagedo, понял... Тупанул, сей час попробую исправить.

Добавлено через 5 минут
Отлично! Armagedo, спасибо, что указали на мою ошибку. Другой вопрос. Как сделать так, что бы список обновлялся поле добавления нового элемента? Так понимаю, что это как-то связано с курсором. То есть в обработчике кнопки добавить что-то про курсор?

Добавлено через 2 минуты
В примере есть такая вещь:
Java
1
2
3
4
5
6
7
 // обработка нажатия кнопки
  public void onButtonClick(View view) {
    // добавляем запись
    db.addRec("sometext " + (cursor.getCount() + 1), R.drawable.ic_launcher);
    // обновляем курсор
    cursor.requery();
  }
То есть " имя_курсора.requery(); "
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2015, 21:13     SQLite and ListView. Ввод и вывод данных
Еще ссылки по теме:
Вывод из базы данных в ListView через SimpleCursorAdapter Android
ListView + SQLite Android
ListView и SQLite Android
Android Картинка из SQLite в ListView
Идентификация ListView + SQLite Android

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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.04.2015, 21:13     SQLite and ListView. Ввод и вывод данных #20
Ну, обновил ты курсор и что дальше?
Откуда адаптер знает, что данные изменились?
Yandex
Объявления
16.04.2015, 21:13     SQLite and ListView. Ввод и вывод данных
Ответ Создать тему
Опции темы

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