Как я могу встроить базу данных SQLite в приложение?
Я думаю, что у меня есть основная проблема понимания, поэтому, возможно, кто-то может помочь: -)
Я разрабатываю приложение для Android с использованием Eclipse, и это приложение будет использовать базу данных (только чтение из базы данных будет реализовано). База данных содержит около 4000 записей, т.е. Создание и заполнение базы данных через исходный код не является вариантом. Таким образом, я создал базу данных заранее со всеми ее записями.
Но как я могу "внедрить" этот файл базы данных в свое приложение, а затем получить к нему доступ? Размер файла будет около 500 кбайт. Загрузка с удаленного сервера не является вариантом, поскольку это не разрешено.
Спасибо,
Роберт
Ответы
Ответ 1
Я решил эту проблему:
-
добавление file.db
в папку project/assets;
-
запись следующего класса:
public class LinnaeusDatabase extends SQLiteOpenHelper{
private static String DATABASE_NAME = "Dragonfly.db";
public final static String DATABASE_PATH = "/data/data/com.kan.linnaeus/databases/";
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase dataBase;
private final Context dbContext;
public LinnaeusDatabase(Context context) {
super(context, DBActivity.DatabaseName, null, DATABASE_VERSION);
this.dbContext = context;
DATABASE_NAME = DBActivity.DatabaseName;
// checking database and open it if exists
if (checkDataBase()) {
openDataBase();
} else
{
try {
this.getReadableDatabase();
copyDataBase();
this.close();
openDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
Toast.makeText(context, "Initial database is created", Toast.LENGTH_LONG).show();
}
}
private void copyDataBase() throws IOException{
InputStream myInput = dbContext.getAssets().open(DATABASE_NAME);
String outFileName = DATABASE_PATH + DATABASE_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.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException {
String dbPath = DATABASE_PATH + DATABASE_NAME;
dataBase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
boolean exist = false;
try {
String dbPath = DATABASE_PATH + DATABASE_NAME;
checkDB = SQLiteDatabase.openDatabase(dbPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
Log.v("db log", "database does't exist");
}
if (checkDB != null) {
exist = true;
checkDB.close();
}
return exist;
}
}
Ответ 2
Хорошая статья в блоге ReignDesign под названием Использование собственной базы данных SQLite в приложениях Android. В основном вы создаете базу данных, помещаете ее в каталог ресурсов в вашем apk и при первом использовании копируете в каталог "/data/data/YOUR_PACKAGE/database/".
Ответ 3
Я делал это в прошлом, сохраняя файл JSON в приложении в ресурсах res/raw
, а затем загружая файл при первой загрузке. Оттуда вы можете использовать режим массовой вставки для пакетного импорта записей. См. мой загрузчик базы данных для Units в качестве примера этой методики. Одно из преимуществ стиля res/raw
заключается в том, что вы можете использовать систему выбора ресурсов Android для локализации данных в разных регионах, поэтому у вас может быть другая база данных (или ее часть) для разных языков или регионов.
Вы также можете поместить исходный SQL-дамп в аналогичный файл и загрузить его при первой загрузке. Вы можете получить файл из ресурсов, используя openRawResource (int). Я бы рекомендовал это вместо хранения предварительно созданного файла базы данных sqlite, чтобы повысить совместимость между версиями sqlite, а также упростить ведение базы данных (из POV жизненного цикла приложения).
При загрузке вещей навалом обязательно используйте транзакции, так как это ускорит процесс и сделает загрузку более надежной.
Ответ 4
В комментарии к этому ответу CommonsWare рекомендует использовать тот же метод, предложенный здесь @evilone (т.е. самостоятельно копировать базу данных из активов). Вместо этого вы должны использовать проверенный и проверенный SQLiteAssetHelper
. Я использовал его в Android Studio, и он работает хорошо.
направления довольно ясны. Вот несколько ключевых выдержек:
Если вы используете систему сборки Gradle, просто добавьте следующее зависимостей в вашем файле build.gradle
:
dependencies {
compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
Расширьте SQLiteAssetHelper
, как обычно, SQLiteOpenHelper
, предоставляя конструктору имя базы данных и номер версии:
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "northwind.db";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
Поместите свою базу данных в assets/databases/northwind.db
(используя любое имеющееся имя базы данных).
База данных доступна для использования в первый раз getReadableDatabase()
или getWritableDatabase()
.