В большинстве примерах база данных создается впоследствии каких либо действий со стороны пользователя, к примеру в приложении блокнот - хранение заметок. Но если возникла необходимость использовать существующую базу с компьютера, тут возникает вопрос...
SQLiteOpenHelper не позволяет открывать базу напрямую, например с карты памяти.
Решением было положить свою базу в папку /assets/ в проекте. В классе DataBaseHelper можно написать метод для копирования базы в InputStream в папку с установленным приложением. Базы в андроид по умолчанию кладутся в /data/data/имя_пакета/databases/.
Так же можно написать пару вспомогательных методов для обработки открытия и закрытия базы.
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/имя_пакета/databases/";
private static String DB_NAME = "database.db";
SQLiteDatabase myDataBase;
private final Context myContext;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (!dbExist) {
getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
}
if (checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
System.out.println(myPath);
myDataBase = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
@Override
public void close() {
if (myDataBase != null)
System.out.println("close method ");
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Этот класс проверит существует ли база уже на устройстве, если нет то создаст ее. Конечно, если база большая, то это займет некоторое время, поэтому лучше это выполнять в отдельном потоке (как в принципе и любой запрос к ней), и уведомлять о процессе выполнения в progressbar.
Далее с существующей базой можно работаться стандартными методами по обновлению, вставки и удалению значений.
Записи из базы вытягиваются курсором
Cursor cursor = myDataBase.query(...);
В другом классе где нужна работа с базой, создаем объект
DataHelperDatabase dbhelper = new DataBaseHelper(this)
Создаем базу:
dbhelper.createDataBase();
Открываем базу:
dbhelper.openDataBase();
//выбираем нужные записи курсором.
Чтобы не плодить закрываем соединение:
dataBaseHelper.myDataBase.close();
dbhelper.close();
Комментариев нет:
Отправить комментарий