Om een verpakte database (d.w.z. een database die is opgenomen als een asset) volledig te gebruiken, moet de database worden uitgepakt (automatisch) en naar een geschikte locatie worden gekopieerd (meestal data/data/<package_name>/databases/<database_name>
waar <package_name>
en <database_name>
zal zijn volgens respectievelijk de pakketnaam van de app en de databasenaam).
Om de database te "verpakken" moet deze worden opgenomen in de activamap en bij voorkeur in een databasemap (vereist als SQLiteAssetHelper zonder wijziging wordt gebruikt ).
Bovendien moet de kopie worden gemaakt voordat de database daadwerkelijk wordt geopend, waarna deze kan worden geopend.
Gebruik maken van SQLiteAssetHelper
-
De allereerste stap is het maken van de database die moet worden verpakt, dit wordt niet behandeld, omdat er talloze tools beschikbaar zijn. Voor dit voorbeeld is de database een bestand met de naam test.db
-
U moet dan uw project maken, in dit geval heeft het project de naam DBtest . gekregen met een Compnay Domian als com.DBtest dus de pakketnaam is dbtest.com.dbtest .
-
De volgende stap is het kopiëren van de database naar de activamap.
- De items maken map in de src/main map, als deze nog niet bestaat.
- De map databases"" maken in de **assets map, als deze nog niet bestaat.
-
Het databasebestand kopiëren (test.db in dit voorbeeld) in de databasemap.
-
De volgende fase is het opzetten van het project om de SQLiteAssetHelper te gebruiken door het op te nemen in build.gradle van de app. .
- Bewerk de build.gradle in de App map.
- Voeg de regel toe
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
binnen de sectie afhankelijkheden. - Klik op Nu synchroniseren
-
Maak een klasse die een subklasse is van de nieuw/nu beschikbare SQLiteAssethelper-klasse. Voor deze oefening heet het DBHelper .
- Klik met de rechtermuisknop op de Hoofdactiviteit java-klasse, selecteer Nieuw en vervolgens Java-klasse.
- Voer in het veld Naam DBHelper . in .
- In het SuperClass-veld begin je SQLiteAsset te typen (inmiddels kan de SQliteAssetHelper-klasse worden geselecteerd), dus selecteer deze. Het zou moeten zijn:-
- Klik op OK.
-
Maak de constructor voor de klasse DBHelper in de trant van
:-
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);
}
}
-
Maak een instantie van de DBHelper en ga vervolgens naar de database.
- Opmerking voor het gemak een andere klasse genaamd CommonSQLiteUtilities , zoals gekopieerd van Zijn er methoden die helpen bij het oplossen van veelvoorkomende SQLite-problemen?
-
Maak een instantie van de DBHelper cclass met iets in de trant van
DBHelper mDBHlpr = new DBHelper(this);
-
met behulp van de CommonSQLiteUtilities werd toegang tot de database verkregen met :-
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
-
De hoofdactiviteit werd volledig
:-
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());
}
}
Het resultaat was een succesvolle logboekregistratie:-
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
- De eerste twee regels zijn van
SQliteAssethelper
, de rest komt uit delogDatabaseInfo
methode van deCommonSQLiteUtilities
klas. - Bij volgende runs wordt de database niet gekopieerd omdat deze al bestaat.