6 декабря 2011 г.

Использование sqlite в android

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


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();

Комментариев нет:

Отправить комментарий