Per utilizzare un database in pacchetto (cioè uno incluso come risorsa) per l'utilizzo completo, il database deve essere decompresso (automatico) e copiato in una posizione adatta (molto spesso data/data/<package_name>/databases/<database_name>
dove <package_name>
e <database_name>
saranno rispettivamente in base al nome del pacchetto dell'app e al nome del database).
Per "impacchettare" il database deve essere incluso nella cartella asset e preferibilmente in una cartella database (richiesto se si utilizza SQLiteAssetHelper senza modifiche ).
Inoltre, la copia deve essere eseguita prima di aprire effettivamente il database, dopodiché può essere aperto.
Utilizzo di SQLiteAssetHelper
-
Il primo passo è creare il database da impacchettare, questo non sarà coperto, poiché sono disponibili numerosi strumenti. Per questo esempio il database è un file denominato test.db
-
Dovresti quindi creare il tuo progetto in questo caso il progetto è stato chiamato DBtest con una società Domian come com.DBtest quindi il nome del pacchetto è dbtest.com.dbtest .
-
La fase successiva consiste nel copiare il database nella cartella delle risorse.
- Creazione delle risorse nella cartella src/main cartella, se non esiste già.
- Creazione della cartella database"" negli **asset cartella, se non esiste già.
-
Copia del file di database (test.db in questo esempio) nella cartella del database.
-
La fase successiva consiste nell'impostare il progetto per utilizzare SQLiteAssetHelper includendolo nel build.gradle dell'app. .
- Modifica il build.gradle nell'App cartella.
- Aggiungi la riga
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
all'interno della sezione delle dipendenze. - Fai clic su Sincronizza ora
-
Creare una classe che sia una sottoclasse della classe SQLiteAssethelper appena disponibile/ora disponibile. Per questo esercizio si chiamerà DBHelper .
- Fai clic con il pulsante destro del mouse su attività principale java, seleziona Nuovo e poi Classe Java.
- Nel campo Nome, inserisci DBHelper .
- Nel campo SuperClass inizia a digitare SQLiteAsset (a questo punto la classe SQliteAssetHelper sarà selezionabile), quindi selezionala. Dovrebbe risolversi in:-
- Fai clic su OK.
-
Crea il costruttore per la classe DBHelper sulla falsariga di
:-
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);
}
}
-
Crea un'istanza di DBHelper e quindi accedi al database.
- Nota per comodità un'altra classe chiamata CommonSQLiteUtilities , come copiato da Esistono metodi che aiutano a risolvere i problemi comuni di SQLite?
-
Crea un'istanza della cclass DBHelper usando qualcosa sulla falsariga di
DBHelper mDBHlpr = new DBHelper(this);
-
utilizzando CommonSQLiteUtilities è stato effettuato l'accesso al database utilizzando :-
CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
-
La MainActivity per intero è diventata
:-
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());
}
}
Il risultato è stato una registrazione dell'esecuzione riuscita :-
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
- Le prime due righe provengono da
SQliteAssethelper
, il resto proviene dalogDatabaseInfo
metodo diCommonSQLiteUtilities
classe. - Nelle esecuzioni successive il database non verrà copiato poiché esiste già.