Aby wykorzystać spakowaną bazę danych (tj. dołączoną jako zasób) do pełnego wykorzystania, baza danych musi zostać rozpakowana (automatycznie) i skopiowana do odpowiedniej lokalizacji (najczęściej data/data/
będzie odpowiednio zgodna z nazwą pakietu aplikacji i nazwą bazy danych).
Aby „spakować” bazę danych należy umieścić w folderze zasobów, a najlepiej w folderze baz danych (wymagane w przypadku korzystania z SQLiteAssetHelper bez modyfikacji ).
Dodatkowo kopia musi zostać wykonana przed faktycznym otwarciem bazy danych, po czym można ją otworzyć.
Korzystanie z SQLiteAssetHelper
-
Pierwszym krokiem jest utworzenie bazy danych do spakowania, nie zostanie to omówione, ponieważ dostępnych jest wiele narzędzi. W tym przykładzie bazą danych jest plik o nazwie test.db
-
Powinieneś następnie stworzyć swój projekt, w tym przypadku Projekt został nazwany DBtest z firmą Compnay Domian jako com.DBtest więc nazwa pakietu to dbtest.com.dbtest .
-
Następnym etapem jest skopiowanie bazy danych do folderu zasobów.
- Tworzenie zasobów folder w src/main folder, jeśli jeszcze nie istnieje.
- Tworzenie folderu bazy danych”” w **zasobach folder, jeśli jeszcze nie istnieje.
-
Kopiowanie pliku bazy danych (test.db w tym przykładzie) do folderu bazy danych.
-
Następnym etapem jest skonfigurowanie projektu do korzystania z SQLiteAssetHelper poprzez uwzględnienie go w build.gradle aplikacji .
- Edytuj build.gradle w aplikacji folder.
- Dodaj wiersz
implementacja „com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1”
w sekcji zależności. - Kliknij Synchronizuj teraz
-
Utwórz klasę, która jest podklasą nowo/obecnie dostępnej klasy SQLiteAssethelper. W tym ćwiczeniu będzie się nazywać DBHelper .
- Kliknij prawym przyciskiem myszy Aktywność główna klasa Java, wybierz Nowa, a następnie Klasa Java.
- W polu Nazwa wpisz DBHelper .
- W polu SuperClass zacznij pisać SQLiteAsset (do tej pory można wybrać klasę SQliteAssetHelper), więc wybierz ją. Powinno to być:-
- Kliknij OK.
-
Utwórz konstruktor dla klasy DBHelper zgodnie z liniami
:-
public class DBHelper extends SQLiteAssetHelper {
public static final String DBNAME = "test.db"; //<<<< must be same as file name
public static final int DBVERSION = 1;
public DBHelper(Context context) {
super(context,DBNAME,null,DBVERSION);
}
}
-
Utwórz instancję DBHelper, a następnie uzyskaj dostęp do bazy danych.
- Uwaga dla ułatwienia inna klasa o nazwie CommonSQLiteUtilities , skopiowane z Czy są jakieś metody, które pomagają w rozwiązywaniu typowych problemów z SQLite?
-
Utwórz instancję klasy DBHelper, używając czegoś na wzór
DBHelper mDBHlpr =nowy DBHelper(this);
-
przy użyciu narzędzia CommonSQLiteUtilities do bazy danych uzyskano dostęp za pomocą :-
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
-
Główna działalność stała się w pełni
:-
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelper mDBHlpr = new DBHelper(this);
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
}
}
Rezultatem było pomyślne rejestrowanie przebiegu :-
04-11 06:12:55.091 1401-1401/dbtest.com.dbtest W/SQLiteAssetHelper: copying database from assets...
database copy complete
04-11 06:12:55.123 1401-1401/dbtest.com.dbtest I/SQLiteAssetHelper: successfully opened database test.db
04-11 06:12:55.127 1401-1401/dbtest.com.dbtest D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/dbtest.com.dbtest/databases/test.db
Database Version = 1
Table Name = mytable Created Using = CREATE TABLE mytable (
_id INTEGER PRIAMRY KEY,
mydata TEXT,
inserted INTEGER DEFAULT CURRENT_TIMESTAMP
)
Table = mytable ColumnName = _id ColumnType = INTEGER PRIAMRY KEY Default Value = null PRIMARY KEY SEQUENCE = 0
Table = mytable ColumnName = mydata ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
Table = mytable ColumnName = inserted ColumnType = INTEGER Default Value = CURRENT_TIMESTAMP PRIMARY KEY SEQUENCE = 0
Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
- Pierwsze dwie linie pochodzą z
SQliteAssethelper
, reszta pochodzi zlogDatabaseInfo
metodaCommonSQLiteUtilities
klasa. - W przypadku przebiegów podsekwencji baza danych nie zostanie skopiowana, ponieważ już istnieje.