Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
#1

Запрос данных по ID из нескольких баз данных - Программирование Android

20.08.2014, 08:17. Просмотров 1323. Ответов 16
Метки нет (Все метки)

Доброго времени суток.
Суть вопроса: есть две готовых таблицы: text и buttons, подключенные к проекту.
В таблице text поля(тип): _id(INTEGER), text(TEXT), id_buttons_group(INTEGER), buttons(INTEGER).
В таблице buttons поля: _id(INTEGER), id_group(INTEGER),button_label(TEXT), param(INTEGER).
Таблицы связываются полями id_buttons_group к id_group, то есть заполнение такое
text: 1| некоторый текст| 2| 3
buttons: 1| 2| кнопка 1| 1
2| 2| кнопка 2| 1
Просмотрев примеры, по базам данных, возникли несколько вопросов:
Вопрос 1:
Java
1
2
3
4
private static final String DB_NAME = "main.sqlite3";
    //Хорошей практикой является задание имен полей БД константами
    private static final String TABLE_NAME = "text";
    private static final String TEXT_ID = "_id";
встретился такой код и тут же вопрос смысл задавать в переменную String значение из таблицы (_id), которое идет как целочисленное?
Вопрос 2:
Java
1
2
3
4
5
private SQLiteDatabase database;
//Наш ключевой хелпер
        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME);
        database = dbOpenHelper.openDataBase();
        //Все, база открыта!
окей, а закрыть ее? как я понял, закрытие после завершения с ней работы тоже необходимо, а кода нет.
Вопрос 3:
Как создать запрос, чтобы получить, к примеру, значения строки с id =2; из таблицы text, а также связанные с ней данные из таблицы buttons, основываясь на id_buttons_group и записать значения столбцов обоих таблиц в переменные?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2014, 08:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запрос данных по ID из нескольких баз данных (Программирование Android):

Как перехватить пакет (запрос) данных при текущей передаче данных?
Хочу сделать на подобии валидации - что бы доступ к сети был только на...

Хостинг для баз данных
Делал простые android приложения и был счастлив. Только сейчас встала...

Синхронизация баз данных на клиенте и сервере
Здравствуйте, подскажите как реализовать простенькое клиент-серверное...

Возможно ли создание двух баз данных
Возможно ли создание двух баз? А так же как скажеться на производительности...

Синхронизация баз данных через облако
Здравствуйте! Имеется несколько баз данных на разных ОС, включая Android, беда...

Взаимодействие баз данных на сервере и мобильном устройстве
Здравствуйте, необходимо найти информацию по теме что в шапке написана. Вообще...

16
kirawa
34 / 34 / 1
Регистрация: 12.11.2013
Сообщений: 341
20.08.2014, 08:29 #2
http://vlad8.com/tech/android-sqlite-database/
1)это константа public static final String KEY_ID = "_id";
пишешь потом типа create table "+TABLE_NAME+"("+KEY_ID+" integer primary key autoincrement);";
2) ну закрой чай!
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
20.08.2014, 11:39 #3
Цитата Сообщение от Strelok45 Посмотреть сообщение
из нескольких баз данных
следи за терминами! не из нескольких баз, а из нескольких таблиц! По базам тоже вроде можно, но это совсем другая технология...
0
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
20.08.2014, 12:15  [ТС] #4
ладно, конкретней вопрос. вот есть один из примеров http://idev.by/android/145/
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
package by.idev.android.ownsqlitedb.activity;
 
import java.util.ArrayList;
 
import by.idev.android.ownsqlitedb.R;
import by.idev.android.ownsqlitedb.R.layout;
import by.idev.android.ownsqlitedb.dbhelper.ExternalDbOpenHelper;
import android.app.Activity;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
public class IdevOwnSqliteDbActivity extends ListActivity {
    private static final String DB_NAME = "yourdb.sqlite3";
    //Хорошей практикой является задание имен полей БД константами
    private static final String TABLE_NAME = "friends";
    private static final String FRIEND_ID = "_id";
    private static final String FRIEND_NAME = "name";
 
    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList friends;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //Наш ключевой хелпер
        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME);
        database = dbOpenHelper.openDataBase();
        //Все, база открыта!
        fillFreinds();
        setUpList();
    }
 
private void setUpList() {
    //Используем стандартный адаптер и layout элемента для краткости
    setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, friends));
    listView = getListView();
 
    //Подарим себе тост — для души
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View view,
                        int position,long id) {
            Toast.makeText(getApplicationContext(),
                        ((TextView) view).getText() +
                         " could be iDev's friend",
                         Toast.LENGTH_SHORT).show();
        }
    });
}
 
//Извлечение элементов из базы данных
private void fillFreinds() {
    friends = new ArrayList<String>();
    Cursor friendCursor = database.query(TABLE_NAME,
                                             new String[] {FRIEND_ID, FRIEND_NAME},
                         null, null,null,null,
                                             FRIEND_NAME);
        friendCursor.moveToFirst();
        if(!friendCursor.isAfterLast()) {
            do {
                String name = friendCursor.getString(1);
                friends.add(name);
            } while (friendCursor.moveToNext());
        }
        friendCursor.close();
    }
}
как задать запрос, чтобы вывести, к примеру, только один элемент с _id=2 в этом не могу разобраться
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
20.08.2014, 13:15 #5
В 68 стр. пиши:
Java
1
FRIEND_ID + " = ?", new String[] { "2" }, null, null,
1
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 05:51  [ТС] #6
Цитата Сообщение от Rube Посмотреть сообщение
В 68 стр. пиши:
Java
1
FRIEND_ID + " = ?", new String[] { "2" }, null, null,
с этим кодом все отлично работает, но я решил дальше эксперементировать и добавил в таблицу еще одно поле: param и следующий код:
Java
1
private static final String PARAM = "param"; // дописал переменную
Java
1
2
3
4
5
6
7
8
9
Cursor friendCursor = database.query(TABLE_NAME,
                                                 new String[] {FRIEND_ID, FRIEND_NAME, PARAM},
                           FRIEND_ID + " = ?", new String[] { "2" }, null, null,
                                                 FRIEND_ID);
            friendCursor.moveToFirst();
            String name = friendCursor.getString(0);
            String name2 = friendCursor.getString(1);
            message.setText(name2 + " " + name);    
            friendCursor.close();
после чего приложение стало выкидывать, где я ошибся? или в коде, что не не дописал или базу данных неправильно меняю?

Добавлено через 11 часов 46 минут
нашел решение: необходимо удалять приложение с эмулятора, перед любым изменением в подключаемой базе данных, после чего она без проблем подключается при новой установке
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
21.08.2014, 08:56 #7
Цитата Сообщение от Strelok45 Посмотреть сообщение
нашел решение
проще увеличить на 1 версию БД.
Java
1
2
3
4
5
6
7
private static final int DB_VERSION = 2;
...
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); // Удаляем таблицы при апгрейде
    onCreate(db); // Создаём новый экземпляр таблицы
}
1
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 11:22  [ТС] #8
Цитата Сообщение от Rube Посмотреть сообщение
проще увеличить на 1 версию БД.
как вариант, спасибо.
Решил пойти дальше и опять столкнулся с проблемой: что если у нас будет две таблицы в базе данных?
первая friends c полями _id, name, param и вторая data c полями _id, param_id, data_label. Таблицы связаны по полю param к param_id (один ко многим). и вывод будет name у нас выводится в TextView message, а вывод data_label сделаем в listView.
Тут опять же вопрос: определил поле второй таблицы
Java
1
private static final String ID_DATA = "_id"
но тут выходит, что такое поле уже существует в таблице friends, и по идее конфликт должен быть?
Пытался запрос сделать по ID 2 элемента из таблицы friends взять из поля param данные и на основе их еще второй запрос сделать чтобы список элементов из таблицы data получить у которых param_id будет таким же, как и в param. Пока не пришел к решению еще.. как правильнее такой код будет организовать? пробовал создать запрос из связанных таблиц - тоже не вышло..
0
kirawa
34 / 34 / 1
Регистрация: 12.11.2013
Сообщений: 341
21.08.2014, 11:34 #9
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
21.08.2014, 12:06 #10
Не будет, более того, можно использовать одну константу для _id для всех таблиц.
Java
1
2
String query = "SELECT * FROM friends INNER JOIN data ON friends._id = data._id"
Cursor cursor = database.rawQuery(query, null);
Это запрос rawQuery, иногда он более читабелен, чем query. Не забудьте заменить имена в запросе на Ваши константы.
0
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 13:45  [ТС] #11
Цитата Сообщение от Rube Посмотреть сообщение
Это запрос rawQuery, иногда он более читабелен, чем query. Не забудьте заменить имена в запросе на Ваши константы.
с константами что то не хочет работать
Java
1
String query = "SELECT * FROM TABLE_NAME2 INNER JOIN TABLE_NAME ON PARAM = PARAM_GROUP";
а так работает, только выдает данные полностью все из таблицы data, вот как теперь правильно задать условие в запросе, чтобы он выдавал только данные соответствующие параметру params в строке с _id=2 в таблице friends. (я его в переменную name занес)
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
92
93
94
95
96
package com.example.sqltable;
 
import java.util.ArrayList;
 
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends ListActivity {
    private static final String DB_NAME = "yourdb.sqlite3";
    //Хорошей практикой является задание имен полей БД константами
    private static final String TABLE_NAME = "friends";
    private static final String FRIEND_ID = "_id";
    private static final String FRIEND_NAME = "name";
    private static final String PARAM = "param";
    
    private static final String TABLE_NAME2 = "data";
    private static final String DATA_ID = "_id";
    private static final String PARAM_GROUP = "param_id";
    private static final String LABEL = "data_label";
 
 
    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList friends;
    TextView message;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        message = (TextView) findViewById(R.id.message);
 
        //Наш ключевой хелпер
        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME);
        database = dbOpenHelper.openDataBase();
        //Все, база открыта!
        fillFreinds();
        //setUpList();
    }
 
private void setUpList() {
    //Используем стандартный адаптер и layout элемента для краткости
    setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, friends));
    listView = getListView();
 
    //Подарим себе тост — для души
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View view,
                        int position,long id) {
            Toast.makeText(getApplicationContext(),
                        ((TextView) view).getText() +
                         " could be iDev's friend",
                         Toast.LENGTH_SHORT).show();
        }
    });
}
 
private void fillFreinds() {
    
    Cursor friendCursor = database.query(TABLE_NAME,
                                             new String[] {FRIEND_ID, FRIEND_NAME, PARAM},
                       FRIEND_ID + " = ?", new String[] { "2" }, null, null,
                                             FRIEND_ID);
        friendCursor.moveToFirst();
        String name = friendCursor.getString(2);
        message.setText(name);
        friendCursor.close();
        
        friends = new ArrayList<String>();
        String query = "SELECT * FROM data INNER JOIN friends ON friends.param = data.param_id";
        Cursor cursor = database.rawQuery(query, null);
        
        cursor.moveToFirst();
        if(!cursor.isAfterLast()) {
            do {
                String label = cursor.getString(2);
                friends.add(label);
            } while (cursor.moveToNext());
        }
        cursor.close();
        
        setUpList();
        
    }
}
и не понял, что нам дает указание параметра в стр 74?
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
21.08.2014, 14:16 #12
Цитата Сообщение от Strelok45 Посмотреть сообщение
с константами что то не хочет работать
Отделяйте текст от переменных:
Java
1
String query = "SELECT * FROM " + TABLE_NAME2 + " INNER JOIN " + TABLE_NAME + " ON " + PARAM + " = " + PARAM_GROUP;
вот как теперь правильно задать условие в запросе
Если я правильно понял что вы хотите получить, то добавить к query + " WHERE " + friends + "." + PARAM + "=2"
74 стр - сортировка.
Замените * в запросе на имена полей, которые хотите получить. Хотя они и так будут там все.
1
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 15:18  [ТС] #13
Цитата Сообщение от Rube Посмотреть сообщение
Если я правильно понял что вы хотите получить, то добавить к query + " WHERE " + friends + "." + PARAM + "=2"
если я правильно понял
Java
1
2
3
4
String query = "SELECT * FROM " + TABLE_NAME2 + 
                " INNER JOIN " + TABLE_NAME + " ON " + PARAM + " = " + PARAM_GROUP +
                " WHERE " + friends + "." + PARAM + "=2";
        Cursor cursor = database.rawQuery(query, null);
но такой код ошибку выкидывает
0
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 15:39  [ТС] #14
а получить я хотел вот что: если мы делаем запрос по id из таблицы friends (к примеру id=2 в нашем случае), то следуя из столбца param (у нас он тогда будет равен 3) запрашиваем из таблицы data данные, где в столбце param_id будет также значение 3 (то есть 2 и 3 строка).
0
Миниатюры
Запрос данных по ID из нескольких баз данных   Запрос данных по ID из нескольких баз данных  
Strelok45
11 / 11 / 6
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 15:47  [ТС] #15
в TextView message у меня выводится сейчас значение param = 3, а в listView значения из поля data_label (все пять строк, а хочу сделать, чтобы только данные 2 и данные 3 выводились)
0
kirawa
34 / 34 / 1
Регистрация: 12.11.2013
Сообщений: 341
21.08.2014, 16:51 #16
Java
1
2
3
public Cursor select(long id){
        return database.query(true, TABLE_NAME,new String[]{DATA_LABEL},PARAM_ID+ "=" + id, null, null, null, null, null);
    }
1
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
21.08.2014, 17:48 #17
Java
1
2
3
4
5
6
String query = "SELECT " + LABEL + " FROM " + TABLE_NAME2 + 
     " INNER JOIN " + TABLE_NAME + " ON " + PARAM + " = " + PARAM_GROUP +
     " WHERE " + PARAM_GROUP + " = 2";
Cursor cursor = database.rawQuery(query, null);
while (cursor.moveToNext())
     friends.add(cursor.getString(cursor.getColumnIndex(LABEL)));
1
21.08.2014, 17:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2014, 17:48
Привет! Вот еще темы с решениями:

Правильное проектирование баз данных при очень частом обращении
Пишу мессенджер и в истории переписок в адаптере очень часто вызывается...

Обработка нескольких баз данных
Доброго времени, форумчане. Весь интернет изрыл. Необходимо выполнить что-типа...

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

Создание нескольких баз данных mysql
Здраствуйте подскажите пожалуйсто как мне создать несколько баз данных mysql


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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