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

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

Войти
Регистрация
Восстановить пароль
 
 
Strelok45
11 / 11 / 0
Регистрация: 18.02.2010
Сообщений: 149
#1

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

20.08.2014, 08:17. Просмотров 1142. Ответов 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
Здравствуйте, подскажите как реализовать простенькое клиент-серверное приложение в котором при редактировании бд сервера автоматически...

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

Возможно ли создание двух баз данных - Программирование Android
Возможно ли создание двух баз? А так же как скажеться на производительности такое решение. Одна база данных заполнена, а другую...

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

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

16
kirawa
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
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 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
20.08.2014, 11:39 #3
Цитата Сообщение от Strelok45 Посмотреть сообщение
из нескольких баз данных
следи за терминами! не из нескольких баз, а из нескольких таблиц! По базам тоже вроде можно, но это совсем другая технология...
0
Strelok45
11 / 11 / 0
Регистрация: 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,071
20.08.2014, 13:15 #5
В 68 стр. пиши:
Java
1
FRIEND_ID + " = ?", new String[] { "2" }, null, null,
1
Strelok45
11 / 11 / 0
Регистрация: 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,071
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 / 0
Регистрация: 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
33 / 33 / 1
Регистрация: 12.11.2013
Сообщений: 336
21.08.2014, 11:34 #9
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,071
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 / 0
Регистрация: 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,071
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 / 0
Регистрация: 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 / 0
Регистрация: 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 / 0
Регистрация: 18.02.2010
Сообщений: 149
21.08.2014, 15:47  [ТС] #15
в TextView message у меня выводится сейчас значение param = 3, а в listView значения из поля data_label (все пять строк, а хочу сделать, чтобы только данные 2 и данные 3 выводились)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2014, 15:47
Привет! Вот еще темы с ответами:

1C 8.x (тонкий) Обработка нескольких баз данных - 1С
Доброго времени, форумчане. Весь интернет изрыл. Необходимо выполнить что-типа такого: Можно ли одним приложением вытаскивать...

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

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

Запрос из двух баз данных - SQL Server
Всем привет! как выполнить SELECT из двух баз данных? SELECT ID,TORG,(SELECT id,name FROM(вот здесь как взять таблицу с другой базы)...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
21.08.2014, 15:47
Ответ Создать тему
Опции темы

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