Доступ к базе SQLite расположенной в assets

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Barrya42
Сообщения: 10
Зарегистрирован: 19 сен 2012, 13:05

Доступ к базе SQLite расположенной в assets

Сообщение Barrya42 » 25 окт 2012, 12:56

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Доступ к базе SQLite расположенной в assets

Сообщение AndreyI » 25 окт 2012, 17:40

Если бы было можно, то так бы и поступали.
Ресурсы приложения включая assets находятся в apk приложения и прямого доступа к ним нет (только посредством AssetManager и других инструментов работы с ресурсами OS), а обращение к SQLite базе предполагает прямой доступ к файлу базы, даже если она открывается только для чтения.

Barrya42
Сообщения: 10
Зарегистрирован: 19 сен 2012, 13:05

Re: Доступ к базе SQLite расположенной в assets

Сообщение Barrya42 » 26 окт 2012, 05:31

Спасибо за помощь... Буду искать другой путь решения проблемы.

Oskar
Сообщения: 4
Зарегистрирован: 03 дек 2012, 13:47

Re: Доступ к базе SQLite расположенной в assets

Сообщение Oskar » 03 дек 2012, 14:18

Ребята, есть примеры с уже существующей базой данных? Поделитесь пожалуйста, не могу разобраться.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Доступ к базе SQLite расположенной в assets

Сообщение AndreyI » 03 дек 2012, 14:43

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

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class MainActivity extends Activity {
	private static final String DB_NAME = "mydb.db";// Имя БД в Assets
	private String DB_PATH; // Полный путь к БД, включая имя в месте хранения БД
				// приложения.

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		DB_PATH = getDatabasePath(DB_NAME).getAbsolutePath();
		if (!isDBexists(DB_PATH)) {
			try {
				copyDB();
			} catch (IOException e) {
				// IOException
			}
		}
	}

	// Проверка наличия скопированной из Assets БД
	private boolean isDBexists(String db_path) {
		File dbFile = new File(db_path);
		return dbFile.exists();
	}

	// Копирование БД из Assets
	private void copyDB() throws IOException {
		SQLiteDatabase sqlDB = openOrCreateDatabase(DB_NAME,
				SQLiteDatabase.OPEN_READONLY, null);
		sqlDB.close();
		InputStream mInput = getAssets().open(DB_NAME);
		OutputStream mOutput = new FileOutputStream(DB_PATH);
		byte[] mBuffer = new byte[1024];
		int mLength;
		while ((mLength = mInput.read(mBuffer)) > 0) {
			mOutput.write(mBuffer, 0, mLength);
		}
		mOutput.flush();
		mOutput.close();
		mInput.close();
	}
}

Oskar
Сообщения: 4
Зарегистрирован: 03 дек 2012, 13:47

Re: Доступ к базе SQLite расположенной в assets

Сообщение Oskar » 03 дек 2012, 15:04

Андрей а как связать инфу с вьюхами в другом классе можешь показать? Меня интересует адаптер, но только нужно вывести не в список а просто на страничку..Вобще что бы ты представлял,тема примерно такая. Есть база, в ней одна таблица с двумя столбцами id и description, Нужно достать значение description по id c и связать с опеределенной вьюхой на экране.
Последний раз редактировалось Oskar 03 дек 2012, 15:05, всего редактировалось 1 раз.

Oskar
Сообщения: 4
Зарегистрирован: 03 дек 2012, 13:47

Re: Доступ к базе SQLite расположенной в assets

Сообщение Oskar » 03 дек 2012, 15:05

Кстати большое спасибо за ответ, очень полезный код.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Доступ к базе SQLite расположенной в assets

Сообщение AndreyI » 03 дек 2012, 15:38

В любом случае все запросы к БД SQLite возвращают курсор, страшного ничего не будет, если он будет содержать значение единственного поля и один столбец.
Открывайте БД, делайте запрос по id, получайте курсор с одним столбцом description и из курсора получите значение, которое поместите во вьюху.
Можно сразу считать всю ВД в курсор (оба столбца и все записи), а из курсора потом получать значения, но нужно будет перебирать записи, получать id, при нахождении нужного id считать description из той же позиции.

Oskar
Сообщения: 4
Зарегистрирован: 03 дек 2012, 13:47

Re: Доступ к базе SQLite расположенной в assets

Сообщение Oskar » 04 дек 2012, 09:59

AndreyI писал(а):В любом случае все запросы к БД SQLite возвращают курсор, страшного ничего не будет, если он будет содержать значение единственного поля и один столбец.
Открывайте БД, делайте запрос по id, получайте курсор с одним столбцом description и из курсора получите значение, которое поместите во вьюху.
Можно сразу считать всю ВД в курсор (оба столбца и все записи), а из курсора потом получать значения, но нужно будет перебирать записи, получать id, при нахождении нужного id считать description из той же позиции.
Андрей,всё это конечно красиво...Но нужен пример, их есть у тебя :)???
Я новичок еще в этой теме, и мне не особо понятно что где использовать(допустим методы query или rawQuery p.s скорее всего второй).
Если тебе не сложно подскажи.Буду очень благодарен.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Доступ к базе SQLite расположенной в assets

Сообщение AndreyI » 04 дек 2012, 10:41

Попробуйте хотябы выполнить уроки по SQLite на этом сайте. Я уже почти на крыле в Индию, сейчас нет особо времени во что-то углубляться.

Ответить