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

Вытащить информацию из SQLite на новое Activity - Android

Войти
Регистрация
Восстановить пароль
 
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 16
04.04.2016, 00:10     Вытащить информацию из SQLite на новое Activity #1
Здравствуйте!
У меня есть 3 класса:
В DB создаю базу данных, записи добавляются прямо из приложения.
В MainActivity по данным из базы создаю ListView, заполняемый с помощью CursorLoader.
По идее, в зависимости от выбранного объекта из ListView запускается новое activity, которое отображает данные из БД по этому объекту. За это должен отвечать третий класс - OneEvent.

Реализовать открытие нового activity у меня получилось, вопрос - как вытащить информацию БД на этот activity?

Коды классов:
MainActivity
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
 
import android.content.Context;
import android.database.Cursor;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
 
 
import java.util.concurrent.TimeUnit;
 
public class MainActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> {
 
    private static final int CM_DELETE_ID = 1;
    ListView lvData;
    DB db;
    SimpleCursorAdapter scAdapter;
    final String LOG_TAG = "myLogs";
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        // открываем подключение к БД
        db = new DB(this);
        db.open();
 
        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_TITLE, DB.COLUMN_DATE, DB.COLUMN_TIME };
        int[] to = new int[] { R.id.tvTextTitle, R.id.tvTextDate, R.id.tvTextTime };
 
        // создаем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0);
        lvData = (ListView) findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);
 
        // добавляем контекстное меню к списку
        registerForContextMenu(lvData);
 
        // создаем лоадер для чтения данных
        getSupportLoaderManager().initLoader(0, null, this);
 
       lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
 
             Intent myIntent = new Intent(MainActivity.this , OneEvent.class);
               startActivityForResult(myIntent, 0);
        }
         });
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        menu.add(0, 1, 0, "Добавить событие");
        return super.onCreateOptionsMenu(menu);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        StringBuilder sb = new StringBuilder();
        //noinspection SimplifiableIfStatement
        sb.append("Item Menu");
        Intent intent = new Intent(this, AddEvent.class);
        startActivityForResult(intent, 1);
 
        return super.onOptionsItemSelected(item);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data == null) {return;}
        String title = data.getStringExtra("title");
        String date = data.getStringExtra("date");
        String time = data.getStringExtra("time");
        db.addRec(title, date, time);
        getSupportLoaderManager().getLoader(0).forceLoad();
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }
 
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.delRec(acmi.id);
            // получаем новый курсор с данными
            getSupportLoaderManager().getLoader(0).forceLoad();
            return true;
        }
        return super.onContextItemSelected(item);
    }
 
    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }
 
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(this, db);
    }
 
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }
 
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
 
    }
 
    static class MyCursorLoader extends CursorLoader {
 
        DB db;
 
        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }
 
        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getAllData();
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return cursor;
        }
 
    }
}
OneEvent
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
package ru.startandroid.p000111testing;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import android.view.View.OnClickListener;
/**
 * Created by F.Slowpoke on 03.04.2016.
 */
public class OneEvent extends Activity implements OnClickListener {
 
    TextView tvEventTitle, tvEventDate, tvEventTime;
    int id = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one_event);
    }
 
    @Override
    public void onClick(View v) {
    }
}
DB
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
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * Created by F.Slowpoke on 02.04.2016.
 */
public class DB {
    private static final String DB_NAME = "mydb";
    private static final int DB_VERSION = 1;
    private static final String DB_TABLE = "mytab";
 
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_TITLE = "title";
    public static final String COLUMN_DATE = "date";
    public static final String COLUMN_TIME = "time";
 
    private static final String DB_CREATE =
            "create table " + DB_TABLE + "(" +
                    COLUMN_ID + " integer primary key autoincrement, " +
                    COLUMN_TITLE + " text, " +
                    COLUMN_DATE + " text, " +
                    COLUMN_TIME + " text" +
                    ");";
 
    private final Context mCtx;
 
 
    private DBHelper mDBHelper;
    private SQLiteDatabase mDB;
 
 
    public DB(Context ctx) {
        mCtx = ctx;
    }
 
    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }
 
    // закрыть подключение
    public void close() {
        if (mDBHelper!=null) mDBHelper.close();
    }
 
    // получить все данные из таблицы DB_TABLE
    public Cursor getAllData() {
        return mDB.query(DB_TABLE, null, null, null, null, null, "_id DESC");
    }
 
    // добавить запись в DB_TABLE
    public void addRec(String tit, String dat, String tim) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_TITLE, tit);
        cv.put(COLUMN_DATE, dat);
        cv.put(COLUMN_TIME, tim);
        mDB.insert(DB_TABLE, null, cv);
    }
 
    // удалить запись из DB_TABLE
    public void delRec(long id) {
        mDB.delete(DB_TABLE, COLUMN_ID + "=" + id, null);
    }
 
    // класс по созданию и управлению БД
    private class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context, String name, CursorFactory factory,
                        int version) {
            super(context, name, factory, version);
        }
 
        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DB_CREATE);
 
            ContentValues cv = new ContentValues();
            for (int i = 1; i < 3; i++) {
                cv.put(COLUMN_TITLE, "sometext " + i);
                cv.put(COLUMN_DATE, "sometext " + i);
                cv.put(COLUMN_TIME, "sometext " + i);
                db.insert(DB_TABLE, null, cv);
            }
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2016, 00:10     Вытащить информацию из SQLite на новое Activity
Посмотрите здесь:

Вызвать из ListView новое Activity (где задействован SimpleAdapter) Android
Android Новое Activity или ViewGroup
Из одного Activity получить значение другого Activity Android
Из одной Activity запустить функцию другой Activity Android
Android Не открывается новое окно у которого класс наследуется не от Activity
Android Вытащить информацию из базы данных Sqlite
Переход на новое activity с элемента listView, заполненного через SimpleCursorAdapter Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
04.04.2016, 07:02     Вытащить информацию из SQLite на новое Activity #2
Передайте id через intent в новое активити.
mgc2000
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 8
04.04.2016, 11:38     Вытащить информацию из SQLite на новое Activity #3
поменяй
Java
1
DB db;
на
Java
1
public static DB db;
потом общайся на прямую из другой активити
Java
1
MainActivity.db.addRec();
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
04.04.2016, 12:26     Вытащить информацию из SQLite на новое Activity #4
mgc2000, нельзя так делать!
mgc2000
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 8
04.04.2016, 13:03     Вытащить информацию из SQLite на новое Activity #5
Цитата Сообщение от YuraAAA Посмотреть сообщение
mgc2000, нельзя так делать!
Почему нельзя? И если нельзя, можно ли как то по другому получать доступ к базе данных из другой активити?
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 16
04.04.2016, 14:17  [ТС]     Вытащить информацию из SQLite на новое Activity #6
Я понимаю, что нужно копать в этом направлении, но не знаю как сделать это конкретно для моего примера.
И еще дело в том, что в ListView должны отображаться только заголовок, дата и время, получаемые из БД. А на новом activity будут еще описание, адрес, телефон и некоторые другие данные из БД, которых нет в ListView. И я не знаю как их показать на этом новом activity.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
04.04.2016, 14:20     Вытащить информацию из SQLite на новое Activity #7
mgc2000, Потому что это:
1. Нарушение архитектуры
2. Не решает проблему

FatSlowpoke, я бы сделал кастомный адаптер (наследник BaseAdapter) + кастомная модель. По нажатию передавал бы id записи
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 16
04.04.2016, 15:08  [ТС]     Вытащить информацию из SQLite на новое Activity #8
Извините, я недавно начала разбираться с этим и не совсем понимаю. Если я буду таким образом передавать id записи, то в новом activity будут только данные с ListView или я смогу как то вытаскивать поля из БД, которые не вошли в ListView?
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
04.04.2016, 15:26     Вытащить информацию из SQLite на новое Activity #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
FatSlowpoke, есть несколько вариантов.
1. Мы вытаскиваем все поля из базы, показываем в листвью. По нажатию передаём целиком объект через putSerializable в другую активити и там показываем полный вариант.
2. Вытаскиваем только id и поля для отображения в listview. По нажатию передаём только id, в другой активити делаем запрос к базе по id и показываем целиком объект.

У Вас, видимо, будет первый вариант, так как Вы достаёте все поля из базы.
mgc2000
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 8
04.04.2016, 15:26     Вытащить информацию из SQLite на новое Activity #10
Цитата Сообщение от FatSlowpoke Посмотреть сообщение
Извините, я недавно начала разбираться с этим и не совсем понимаю. Если я буду таким образом передавать id записи, то в новом activity будут только данные с ListView или я смогу как то вытаскивать поля из БД, которые не вошли в ListView?
В новой активити добавь также объект класса DB
Java
1
DB db;
и не забудь открыть базу данных в методе onCreate новой активити
Java
1
2
3
        // открываем подключение к БД
        db = new DB(this);
        db.open();
А дальше можешь уже получить данные из базы по полученному id из intent
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 16
04.04.2016, 22:48  [ТС]     Вытащить информацию из SQLite на новое Activity #11
Еще раз извините, не могли бы Вы поподробнее объяснить как реализовать запрос к базе данных по id?
Попробую сделать второй вариант.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
04.04.2016, 23:46     Вытащить информацию из SQLite на новое Activity #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
FatSlowpoke, сейчас покажу)

Добавлено через 21 минуту
Цитата Сообщение от FatSlowpoke Посмотреть сообщение
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
Последний аргумент это id выбранной записи. Далее, надо передать её через intent.
Java
1
2
3
Intent myIntent = new Intent(MainActivity.this , OneEvent.class);
myIntent.putExtra("id", id);
startActivityForResult(myIntent, 0);
В OneEvent достаём этот id в onCreate методе:
Java
1
long id = getIntent().getLongExtra("id", 0);
Ну и осталось выполнить запрос к базе и достать нужные поля. Но для этого лучше бы сделать модель:
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
public class Event implements Serializable {
 
    private Long id;
    private String title;
    private String date;
    private String time;
 
    public Event(Long id, String title, String date, String time) {
        this.id = id;
        this.title = title;
        this.date = date;
        this.time = time;
    }
 
    public Event(String title, String date, String time) {
        this.title = title;
        this.date = date;
        this.time = time;
    }
 
    public Long getId() {
        return id;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getDate() {
        return date;
    }
 
    public void setDate(String date) {
        this.date = date;
    }
 
    public String getTime() {
        return time;
    }
 
    public void setTime(String time) {
        this.time = time;
    }
}
И надо теперь достать модель. В классе DB делаем метод,


Java
1
2
3
4
5
6
7
8
9
10
11
12
public Event getEventById(Long id) {
    Cursor cursor = mDB.query(DB_TABLE, null, COLUMN_ID + "=?", new String[]{String.valueOf(id)}, null, null, null);
    Event event = null;
    if (cursor.moveToFirst()) {
        event = new Event(cursor.getLong(cursor.getColumnIndex(COLUMN_ID)),
                        cursor.getString(cursor.getColumnIndex(COLUMN_TITLE)),
                        cursor.getString(cursor.getColumnIndex(COLUMN_DATE)),
                        cursor.getString(cursor.getColumnIndex(COLUMN_TIME)));
     }
     cursor.close();
     return event;
}
Ну а далее просто вызываем в активити и достаём Event по id
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 13:05     Вытащить информацию из SQLite на новое Activity
Еще ссылки по теме:

Android При нажатии на элемент ListView вывести новое Activity с информацией об этом элементе
Ошибка при переходе на новое Activity Android
Как вытащить значение из таблицы бд sqlite Android
Изменение layout-элементов одного activity из другого activity Android
Android Вызвать из одной activity функцию другой activity

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

Или воспользуйтесь поиском по форуму:
FatSlowpoke
0 / 0 / 0
Регистрация: 11.06.2013
Сообщений: 16
05.04.2016, 13:05  [ТС]     Вытащить информацию из SQLite на новое Activity #13
Огромное Вам спасибо, все получилось!
Yandex
Объявления
05.04.2016, 13:05     Вытащить информацию из SQLite на новое Activity
Ответ Создать тему
Опции темы

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