SQLite, помогите разобраться

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
whitestars
Сообщения: 33
Зарегистрирован: 07 авг 2014, 13:09

Re: SQLite, помогите разобраться

Сообщение whitestars » 18 авг 2014, 13:35

Вот 2 активити на данный момент

Код: Выделить всё

public class ListActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
	final static String LOG_TAG1 = "ListLogs";
	private static final int CM_DELETE_ID = 1;
	ListView lvData;
	SimpleCursorAdapter scAdapter;
	DB db;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list_main_view);
		db = new DB(this);
	    db.open();
	    Log.d(LOG_TAG1, "DB open");
		String[] from = new String[] {DB.COLUMN_NAME_P, DB.COLUMN_DISTRICT_P, DB.COLUMN_SALARY_POS};
		int[] to = new int[] {R.id.name_textView, R.id.position_textView, R.id.salary_textView};
		scAdapter = new SimpleCursorAdapter (ListActivity.this, R.layout.item, null, from, to, 0);
		lvData = (ListView) findViewById (R.id.data_listView);
		lvData.setAdapter(scAdapter);
		registerForContextMenu(lvData);
		getSupportLoaderManager().initLoader(0, null, this);
		//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();
			String ida = acmi.toString();
			db.delRec(ida);
			getSupportLoaderManager().getLoader(0).forceLoad();
			return true;
		}
		return super.onContextItemSelected(item);
	}
	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
		// TODO Auto-generated method stub
		return new MyCursorLoader (ListActivity.this, db);
	}
	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
		// TODO Auto-generated method stub
		scAdapter.swapCursor(cursor);
	}
	@Override
	public void onLoaderReset(Loader<Cursor> loader) {
		// TODO Auto-generated method stub
		
	}
	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.grpSalaryAll();
			return cursor;
		}
	}
}
Вот класс базы, тут много лишних методов, но я хочу вывести хотя бы один

Код: Выделить всё

public class DB {
	final String LOG_TAG = "MyLog";
	private static final String DB_NAME = "TestDb";
	private static final int DB_VERSION = 2;
	private static final String DB_TABLE_P = "people";
	private static final String DB_TABLE_POS = "position";
	
	public static final String COLUMN_ID_P = "_id";
	public final static String COLUMN_NAME_P = "name";
	public final static String COLUMN_DISTRICT_P = "district";
	private static final String COLUMN_POSID_P = "posid";
	
	public static final String COLUMN_ID_POS = "_id";
	public static final String COLUMN_NAME_POS = "name";
	public final static String COLUMN_SALARY_POS = "salary";
	private static final String DB_CREATE_P = 
			"create table " + DB_TABLE_P + "(" + 
					COLUMN_ID_P + " integer primary key autoincrement, " + 
					COLUMN_NAME_P + " text," + 
					COLUMN_DISTRICT_P + " text, " +
					COLUMN_POSID_P + " integer" + 
					");";
	private static final String DB_CREATE_POS = 
			"create table " + DB_TABLE_POS + "(" + 
					COLUMN_ID_POS + " integer primary key, " +
					COLUMN_NAME_POS + " text, " + 
					COLUMN_SALARY_POS + " integer" + 
					");";
	private final Context mCtx;
	private DBHelper mDBHelper;
	private SQLiteDatabase mDB;
	int[] position_id = {1, 2, 3, 4};
	String[] position_name = {"Director", "Programmer", "Buhgalter", "Security"};
	int[] position_salary = {15000, 13000, 10000, 8000};
	String tablex = "people as PL inner join position as PS on PL.posid = PS._id";
	String []columnsx = new String[] {"PL.name as Name","PS._name as Position", "_salary as Salary"};
	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();
	}
	public Cursor getAllData() {
		return mDB.query(DB_TABLE_P, null, null, null, null, null, null);
	}
	public Cursor getAllDataPOS() {
		return mDB.query(DB_TABLE_POS, null, null, null, null, null, null);
	}
	public void addRec (String _name, String _district, String _posid) {
		ContentValues cvRow = new ContentValues();
		cvRow.put(COLUMN_NAME_P, _name);
		cvRow.put(COLUMN_DISTRICT_P, _district);
		cvRow.put(COLUMN_POSID_P, _posid);
		long rowId = mDB.insert(DB_TABLE_P, null, cvRow);
		Log.d(LOG_TAG, "Create row ID = " + rowId);
	}
	public void delRec (String _id) {
		mDB.delete(DB_TABLE_P, COLUMN_ID_P + "=" + _id, null);
	}
	public void updRec (String _uid, String _name, String _district, String _posid) {
		ContentValues cvRow = new ContentValues();
		cvRow.put(COLUMN_NAME_P, _name);
		cvRow.put(COLUMN_DISTRICT_P, _district);
		cvRow.put(COLUMN_POSID_P, _posid);
		mDB.update(DB_TABLE_P, cvRow, "_id = ?", new String[] {_uid});
	}
	public void delTbl () {
		mDB.delete(DB_TABLE_P, null, null);
	}
	public void grpSalary (String _salary) {
	String sqlRawQuery = "select PL.name as Name, PS.name as Position, salary as Salary"
			+ "from people as PL"
			+ "inner join position as PS"
			+ "on PL.posid = PS._id"
			+ "where _salary > ?";	
	mDB.rawQuery(sqlRawQuery, new String[] {_salary});
	}
	public Cursor grpSalaryAll () {
		String table = "people as PL inner join position as PS on PL.posid = PS._id";
		String columns[] = { "PL._id as IDP", "PL.name as Name", "PS._id as IDPOS", "PS.name as Position", "salary as Salary"};
		return mDB.query(table, columns, null, null, null, null, null);
		}
	public void grpDistrict () {
		String groupBy = "district";
		mDB.query(tablex, columnsx, null, null, groupBy, null, null);
	}
	public void sorting(String _orderBy) {
		mDB.query(tablex, columnsx, null, null, null, null, _orderBy);
	}
	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_P);
		db.execSQL(DB_CREATE_POS);
		Log.d(LOG_TAG, "Create database complete...");
		ContentValues cvRow = new ContentValues();
		for (int i = 0; i < position_id.length; i++) {
			cvRow.clear();
			cvRow.put(COLUMN_ID_POS, position_id[i]);
			cvRow.put(COLUMN_NAME_POS, position_name[i]);
			cvRow.put(COLUMN_SALARY_POS, position_salary[i]);
			db.insert("position", null, cvRow);
			
		}
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		}
	}
	}



Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 18 авг 2014, 14:01

базу данных из устройства или эмулятора (что у тебя там) скачай себе на комп и посмотри что там есть и чего нет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 18 авг 2014, 14:02

и потом.. исправить мало, нужно еще версию базы данных обновить, и чтоб там сработал update таблицы и так далее. Что ты там исправил - не ясно. Ясно, что в таблице ничего не изменилось.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

whitestars
Сообщения: 33
Зарегистрирован: 07 авг 2014, 13:09

Re: SQLite, помогите разобраться

Сообщение whitestars » 18 авг 2014, 14:50

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 18 авг 2014, 14:58

ну кто ж так делает?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

whitestars
Сообщения: 33
Зарегистрирован: 07 авг 2014, 13:09

Re: SQLite, помогите разобраться

Сообщение whitestars » 19 авг 2014, 12:44

Вообщем, я выяснил следующее: при получении курсор адаптер, не знаю почему, не принимает запросы типа связанных таблиц в свои столбцы, в результате чего, я получаю краш, как только я определил абсолютно все столбцы, что у меня есть в 2 таблицах через константы что определены в массиве columns, он мне выкинул список моих записей...Сейчас думаю, как реализовать другие методы с нужными мне выборками, спасибо Инне за демотивацию), я упрямый))

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 12:46

ох блин и написал.. я ничего не поняла :-D
курсор адаптер не знаю почему, не принимает запросы типа связанных таблиц в свои столбцы
ох блин круто - это как?
Я в своих запросах связываю до 10 таблиц к ряду и никто из курсор-адаптеров не возмущался :-D
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLite, помогите разобраться

Сообщение altwin » 19 авг 2014, 12:52

Foenix писал(а):ох блин и написал.. я ничего не поняла :-D
курсор адаптер не знаю почему, не принимает запросы типа связанных таблиц в свои столбцы
ох блин круто - это как?
Я в своих запросах связываю до 10 таблиц к ряду и никто из курсор-адаптеров не возмущался :-D
и наверно используешь group_concat, о котором никому не рассказываешь ))))
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 12:54

ну если ты объяснишь что это............. :-D
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLite, помогите разобраться

Сообщение altwin » 19 авг 2014, 12:57

Foenix писал(а):ну если ты объяснишь что это............. :-D
вот так всегда.. типо я не при делах :) ( http://www.sqlite.org/lang_aggfunc.html )
а как ты делаешь такие запросы?:
[syntax=sql]
SELECT r._id, r.name AS recipe, group_concat(i.name, ",") AS ingredient
FROM recipes r
INNER JOIN recipes_ingredients ri ON ri.recipe_id=r._id
INNER JOIN ingredients i ON ri.ingredient_id=i._id
GROUP BY r._id;
[/syntax]
:mrgreen:
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 13:20

прикольная, конечно, функция, но к запросам из множества таблиц она по-моему имеет опосредованное отношение, мне просто никогда не пригождалась.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: SQLite, помогите разобраться

Сообщение altwin » 19 авг 2014, 13:23

Foenix писал(а):прикольная, конечно, функция, но к запросам из множества таблиц она по-моему имеет опосредованное отношение, мне просто никогда не пригождалась.
просто у меня когда то, что -то не получалось именно из за того, что нужно было что -то объеденить... вот наверно и запомнилось именно так :)
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 13:52

ну вот отрыла как в гугле делают
[syntax=java5]db.execSQL("INSERT INTO " + Qualified.SESSIONS_SEARCH
+ " SELECT s." + Sessions.SESSION_ID + ",("

// Full text body
+ Sessions.SESSION_TITLE + "||'; '||"
+ Sessions.SESSION_ABSTRACT + "||'; '||"
+ "IFNULL(GROUP_CONCAT(t." + Speakers.SPEAKER_NAME + ",' '),'')||'; '||"
+ "'')"

+ " FROM " + Tables.SESSIONS + " s "
+ " LEFT OUTER JOIN"

// Subquery resulting in session_id, speaker_id, speaker_name
+ "(SELECT " + Sessions.SESSION_ID + "," + Qualified.SPEAKERS_SPEAKER_ID
+ "," + Speakers.SPEAKER_NAME
+ " FROM " + Tables.SESSIONS_SPEAKERS
+ " INNER JOIN " + Tables.SPEAKERS
+ " ON " + Qualified.SESSIONS_SPEAKERS_SPEAKER_ID + "="
+ Qualified.SPEAKERS_SPEAKER_ID
+ ") t"

// Grand finale
+ " ON s." + Sessions.SESSION_ID + "=t." + Sessions.SESSION_ID
+ " GROUP BY s." + Sessions.SESSION_ID); [/syntax]

ничего сверхъестественного в объединении таблиц нету.. Правда, это вставка, селект можно через билдер организовать, можно по-разному.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 13:53

селект у них похитрее там запутан, если есть джоины.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

qw123
Сообщения: 41
Зарегистрирован: 27 июн 2014, 12:11

Re: SQLite, помогите разобраться

Сообщение qw123 » 19 авг 2014, 14:22

Здравствуйте, такой вопрос: в андроиде из всех бд можно использовать только лишь sqlite? Если да, то как её создать на ПК? И в любом случае, а как вообще добавить бд в апк, чтобы при установки распаковывалась уже готовая, заполненная бд, а не создавалась новая?
Ну и ещё, при удалении приложения его бд тоже удаляется?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 14:54

qw123 писал(а):Здравствуйте, такой вопрос: в андроиде из всех бд можно использовать только лишь sqlite? Если да, то как её создать на ПК? И в любом случае, а как вообще добавить бд в апк, чтобы при установки распаковывалась уже готовая, заполненная бд, а не создавалась новая?
Ну и ещё, при удалении приложения его бд тоже удаляется?
у тебя не один вопрос, а прям серия. Сразу видно - уроки ты тутошние не читал.
По остальному.
Создать на компе не пробовала, но просмотреть и добавить данные можно. Скорее всего можно и создать таким же меденжером sqlite (их в сети полно)
https://www.google.ru/search?client=ope ... te+manager
готовую кладешь в Assets, потом копируешь из нее в папку приложения и работаешь. Вот, даже с мультиками
https://www.google.ru/search?client=ope ... gws_rd=ssl
может какие-то другие бд и можно использовать, не знаю, смысл над этим задумываться? Можно положить бд в сети (тут уже точно не sqlite, а какая-нибудь mysql на сайте) и юзать ее данные.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

whitestars
Сообщения: 33
Зарегистрирован: 07 авг 2014, 13:09

Re: SQLite, помогите разобраться

Сообщение whitestars » 19 авг 2014, 15:01

Не понимаю почему, но моя запись запроса не воспринималась почему-то, возможно кто-то объяснит... А такой вариант, в запросах я не силен делал как по уроку
Foenix писал(а):ну вот отрыла как в гугле делают
[syntax=java5]db.execSQL("INSERT INTO " + Qualified.SESSIONS_SEARCH
+ " SELECT s." + Sessions.SESSION_ID + ",("

// Full text body
+ Sessions.SESSION_TITLE + "||'; '||"
+ Sessions.SESSION_ABSTRACT + "||'; '||"
+ "IFNULL(GROUP_CONCAT(t." + Speakers.SPEAKER_NAME + ",' '),'')||'; '||"
+ "'')"

+ " FROM " + Tables.SESSIONS + " s "
+ " LEFT OUTER JOIN"

// Subquery resulting in session_id, speaker_id, speaker_name
+ "(SELECT " + Sessions.SESSION_ID + "," + Qualified.SPEAKERS_SPEAKER_ID
+ "," + Speakers.SPEAKER_NAME
+ " FROM " + Tables.SESSIONS_SPEAKERS
+ " INNER JOIN " + Tables.SPEAKERS
+ " ON " + Qualified.SESSIONS_SPEAKERS_SPEAKER_ID + "="
+ Qualified.SPEAKERS_SPEAKER_ID
+ ") t"

// Grand finale
+ " ON s." + Sessions.SESSION_ID + "=t." + Sessions.SESSION_ID
+ " GROUP BY s." + Sessions.SESSION_ID); [/syntax]

ничего сверхъестественного в объединении таблиц нету.. Правда, это вставка, селект можно через билдер организовать, можно по-разному.

qw123
Сообщения: 41
Зарегистрирован: 27 июн 2014, 12:11

Re: SQLite, помогите разобраться

Сообщение qw123 » 19 авг 2014, 15:11

Foenix писал(а):
qw123 писал(а):Здравствуйте, такой вопрос: в андроиде из всех бд можно использовать только лишь sqlite? Если да, то как её создать на ПК? И в любом случае, а как вообще добавить бд в апк, чтобы при установки распаковывалась уже готовая, заполненная бд, а не создавалась новая?
Ну и ещё, при удалении приложения его бд тоже удаляется?
у тебя не один вопрос, а прям серия. Сразу видно - уроки ты тутошние не читал.
По остальному.
Создать на компе не пробовала, но просмотреть и добавить данные можно. Скорее всего можно и создать таким же меденжером sqlite (их в сети полно)
https://www.google.ru/search?client=ope ... te+manager
готовую кладешь в Assets, потом копируешь из нее в папку приложения и работаешь. Вот, даже с мультиками
https://www.google.ru/search?client=ope ... gws_rd=ssl
может какие-то другие бд и можно использовать, не знаю, смысл над этим задумываться? Можно положить бд в сети (тут уже точно не sqlite, а какая-нибудь mysql на сайте) и юзать ее данные.
Спасибо, я уроки просматривал (ну так, немного...), так в каком из уроков объяснялось как копировать бд в телефон? Буду рад почитать этот урок

whitestars
Сообщения: 33
Зарегистрирован: 07 авг 2014, 13:09

Re: SQLite, помогите разобраться

Сообщение whitestars » 19 авг 2014, 15:22

Вот мой метод при котором не выдает ошибки и выводит как положено

Код: Выделить всё

public Cursor grpSalaryAll () {
		String table = "people as PL inner join position as PS on PL.posid = PS._idp";
		String columns[] = { COLUMN_ID_P, COLUMN_ID_POS, COLUMN_NAME_P, COLUMN_DISTRICT_P, COLUMN_SALARY_POS, COLUMN_NAME_POS};
		return mDB.query(table, columns, null, null, null, null, null);
		}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite, помогите разобраться

Сообщение Foenix » 19 авг 2014, 15:33

я вот не понимаю, что все inner join-то так любят? сколько себя помню может 1 раз его использовала .
Допустим вывожу людей и их должности. Это ж outer join по любому. Даже не представляю где нужно было бы выдать только тех людей, которые имеют должности. А остальных вы - так, пробрасываете?

qw123, я уроки тоже не читала, сорри :-D
Смотри ссылку, что я дала, там мало что ли?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить