Um eine gepackte Datenbank (d. h. eine als Asset enthaltene) vollständig zu nutzen, muss die Datenbank (automatisch) entpackt und an einen geeigneten Ort kopiert werden (meistens data/data/<package_name>/databases/<database_name>
wo <package_name>
und <database_name>
entspricht dem Paketnamen der App bzw. dem Datenbanknamen).
Zum "Paketieren" sollte die Datenbank in den Ordner "Assets" aufgenommen werden und vorzugsweise in einen Ordner "Datenbanken" (erforderlich, wenn SQLiteAssetHelper ohne Änderung verwendet wird ).
Außerdem muss die Kopie vor dem eigentlichen Öffnen der Datenbank erfolgen, wonach sie dann geöffnet werden kann.
Verwendung von SQLiteAssetHelper
-
Der allererste Schritt besteht darin, die zu paketierende Datenbank zu erstellen, dies wird nicht behandelt, da zahlreiche Tools verfügbar sind. In diesem Beispiel ist die Datenbank eine Datei namens test.db
-
Sie sollten dann Ihr Projekt erstellen, in diesem Fall hieß das Projekt DBtest mit einem Compnay Domian als com.DBtest der Paketname ist also dbtest.com.dbtest .
-
Im nächsten Schritt kopieren Sie die Datenbank in den Assets-Ordner.
- Erstellen der Assets Ordner im src/main Ordner, falls noch nicht vorhanden.
- Erstellen des Ordners databases"" in den **Assets Ordner, falls noch nicht vorhanden.
-
Kopieren der Datenbankdatei (test.db in diesem Beispiel) in den Datenbankordner.
-
Die nächste Stufe besteht darin, das Projekt so einzurichten, dass es den SQLiteAssetHelper verwendet, indem es in die build.gradle der App aufgenommen wird .
- Bearbeiten Sie die build.gradle in der App Ordner.
- Fügen Sie die Zeile
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
hinzu im Abschnitt "Abhängigkeiten". - Klicken Sie auf Jetzt synchronisieren
-
Erstellen Sie eine Klasse, die eine Unterklasse der neu/jetzt verfügbaren SQLiteAssethelper-Klasse ist. Für diese Übung wird es DBHelper genannt .
- Klicken Sie mit der rechten Maustaste auf die Hauptaktivität Java-Klasse, wählen Sie Neu und dann Java-Klasse.
- Geben Sie im Feld Name DBHelper ein .
- Beginnen Sie im Feld SuperClass mit der Eingabe von SQLiteAsset (jetzt ist die Klasse SQliteAssetHelper auswählbar), also wählen Sie sie aus. Es sollte wie folgt aufgelöst werden:-
- Klicken Sie auf OK.
-
Erstellen Sie den Konstruktor für die DBHelper-Klasse nach dem Vorbild von
:-
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);
}
}
-
Erstellen Sie eine Instanz des DBHelper und greifen Sie dann auf die Datenbank zu.
- Hinweis zur Vereinfachung eine andere Klasse namens CommonSQLiteUtilities , wie kopiert von Gibt es Methoden, die bei der Lösung allgemeiner SQLite-Probleme helfen?
-
Erstellen Sie eine Instanz der DBHelper-C-Klasse, indem Sie etwas in der Art von
verwendenDBHelper mDBHlpr = new DBHelper(this);
-
mit den CommonSQLiteUtilities wurde auf die Datenbank zugegriffen mit :-
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
-
Die MainActivity wurde vollständig zu
:-
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());
}
}
Das Ergebnis war eine erfolgreiche Protokollierung :-
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
- Die ersten beiden Zeilen stammen von
SQliteAssethelper
, der Rest stammt auslogDatabaseInfo
-Methode derCommonSQLiteUtilities
Klasse. - Bei nachfolgenden Läufen wird die Datenbank nicht kopiert, da sie bereits existiert.