För att kunna använda en paketerad databas (dvs en som ingår som en tillgång) för full användning måste databasen packas upp (automatiskt) och kopieras till en lämplig plats (oftast data/data/
För att "paketera" databasen bör inkluderas i tillgångsmappen och helst till en databasmapp (krävs om du använder SQLiteAssetHelper utan ändringar ).
Dessutom måste kopieringen göras innan databasen faktiskt öppnas, varefter den kan öppnas.
Använda SQLiteAssetHelper
-
Det allra första steget är att skapa databasen som ska paketeras, detta kommer inte att täckas, eftersom det finns många tillgängliga verktyg. I det här exemplet är databasen en fil med namnet test.db
-
Du bör sedan skapa ditt projekt i det här fallet har projektet kallats DBtest med en Compnay Domian som com.DBtest så paketnamnet är dbtest.com.dbtest .
-
Nästa steg är att kopiera databasen till tillgångsmappen.
- Skapa tillgångarna mappen i src/main mapp, om den inte redan finns.
- Skapar mappen databaser"" i **tillgångar mapp, om den inte redan finns.
-
Kopiera databasfilen (test.db i det här exemplet) till databasmappen.
-
Nästa steg är att ställa in projektet för att använda SQLiteAssetHelper genom att inkludera det i appens build.gradle .
- Redigera build.gradle i appen mapp.
- Lägg till raden
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
i avsnittet beroenden. - Klicka på Synkronisera nu
-
Skapa en klass som är en underklass till den nyligen/nu tillgängliga SQLiteAssethelper-klassen. För denna övning kommer den att heta DBHelper .
- Högerklicka på MainActivity java-klass, välj Ny och sedan Java-klass.
- I fältet Namn anger du DBHelper .
- Börja skriva SQLiteAsset i SuperClass-fältet (nu kommer klassen SQliteAssetHelper att vara valbar), så välj den. Det bör lösa sig att vara:-
- Klicka på OK.
-
Skapa konstruktorn för DBHelper-klassen i linje med
:-
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);
}
}
-
Skapa en instans av DBHelper och öppna sedan databasen.
- Obs för enkelhetens skull en annan klass som heter CommonSQLiteUtilities , som kopierats från Finns det några metoder som hjälper till att lösa vanliga SQLite-problem?
-
Skapa en instans av DBHelper cclass med hjälp av något i stil med
DBHelper mDBHlpr =new DBHelper(detta);
-
med hjälp av CommonSQLiteUtilities öppnades databasen med :-
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
-
MainActivity i sin helhet blev
:-
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());
}
}
Resultatet blev en lyckad körningsloggning :-
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 två första raderna är från
SQliteAssethelper
, resten är frånlogDatabaseInfo
metod förCommonSQLiteUtilities
klass. - Vid efterföljande körningar kommer databasen inte att kopieras eftersom den redan finns.