Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Koristite svoju SQLite bazu podataka u Android aplikacijama

Većina postojećih primera i uputstva za Android pretpostavljaju da želite da kreirate i popunjavate svoje baze podataka prilikom izvršavanja a ne da se koristite i pristupate nezavisnim bazama podataka koje dolaze sa instaliranom Android aplikacijom.

Metoda koju ću vam pokazati uzima fajl vaše sopstvene SQLite baze podataka iz "assets" foldera i kopira ga u putanju sistemske baze podataka vaše aplikacije tako da interfejs za programiranje aplikacija (API) SQLite baze podataka može da je otvori i normalno joj pristupi.

1. Priprema fajla SQLite baze podataka.

Pretpostavlja se da već imate kreiranu vašu SQLite bazu podataka ali je ipak potrebno da na njoj uradimo neke modifikacije.
Ukoliko nemate sqlite menadžer preporučujem vam da preuzmete aplikaciju otvorenog koda SQLite Database Browser koja je dostupna za Win/Linux/Mac.

Otvorite vašu bazu podataka i dodajte novu tabelu pod nazivom "android_metadata", a to možete da izvršite i sledećom SQL naredbom:

    CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')

Sada ubacite jedan red sa 'en_US' tekstom u "android_metadata" tabelu :

    INSERT INTO "android_metadata" VALUES ('en_US')

Potom, neophodno je da promenite ime primarnog id polja vaše tabele u "_id" tako da Android zna gde da se poveže sa id poljem vaše tabele.
Sve ovo možete veoma lako da uradite koristeći SQLite Database Browser kliknuvši na ikonu za uređivanje tabela , a zatim selektovanjem tabele koju želite da izmenite i konačno selektovanjem polja kome želite da promenite ime.

Nakon preimenovanja id polja svih vaših tabela sa podacima u "_id" i dodavanja tabele "android_metadata, vaša baza podataka je spremna za korišćenje u vašoj Android aplikaciji.

Modified database

Modifikovana baza podataka

Napomena: na ovoj slici vidimo da su tabele "Categories" i "Content" sa id poljima koja su preimenovana u "_id" dodanom tabelom "android_metadata".

2. Kopiranje, otvaranje i pristup vašoj bazi podataka u vašoj Android aplikaciji.

Sada jednostavno ubacite vaš fajl baze podataka u "assets" folder vašeg projekta i kreirajte Helper klasu baze podataka proširenjem SQLiteOpenHelper klase iz "android.database.sqlite" paketa.

Neka vaša DataBaseHelper klasa izgleda ovako:

  • public class DataBaseHelper extends SQLiteOpenHelper{
  •  
  • //The Android's default system path of your application database.
  • private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
  •  
  • private static String DB_NAME = "myDBName";
  •  
  • private SQLiteDatabase myDataBase;
  •  
  • private final Context myContext;
  •  
  • /**
  •   * Constructor
  •   * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
  •   * @param context
  •   */
  • public DataBaseHelper(Context context) {
  •  
  • super(context, DB_NAME, null, 1);
  • this.myContext = context;
  • }
  •  
  • /**
  •   * Creates a empty database on the system and rewrites it with your own database.
  •   * */
  • public void createDataBase() throws IOException{
  •  
  • boolean dbExist = checkDataBase();
  •  
  • if(dbExist){
  • //do nothing - database already exist
  • }else{
  •  
  • //By calling this method and empty database will be created into the default system path
  • //of your application so we are gonna be able to overwrite that database with our database.
  • this.getReadableDatabase();
  •  
  • try {
  •  
  • copyDataBase();
  •  
  • } catch (IOException e) {
  •  
  • throw new Error("Error copying database");
  •  
  • }
  • }
  •  
  • }
  •  
  • /**
  •   * Check if the database already exist to avoid re-copying the file each time you open the application.
  •   * @return true if it exists, false if it doesn't
  •   */
  • private boolean checkDataBase(){
  •  
  • SQLiteDatabase checkDB = null;
  •  
  • try{
  • String myPath = DB_PATH + DB_NAME;
  • checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  •  
  • }catch(SQLiteException e){
  •  
  • //database does't exist yet.
  •  
  • }
  •  
  • if(checkDB != null){
  •  
  • checkDB.close();
  •  
  • }
  •  
  • return checkDB != null ? true : false;
  • }
  •  
  • /**
  •   * Copies your database from your local assets-folder to the just created empty database in the
  •   * system folder, from where it can be accessed and handled.
  •   * This is done by transfering bytestream.
  •   * */
  • private void copyDataBase() throws IOException{
  •  
  • //Open your local db as the input stream
  • InputStream myInput = myContext.getAssets().open(DB_NAME);
  •  
  • // Path to the just created empty db
  • String outFileName = DB_PATH + DB_NAME;
  •  
  • //Open the empty db as the output stream
  • OutputStream myOutput = new FileOutputStream(outFileName);
  •  
  • //transfer bytes from the inputfile to the outputfile
  • byte[] buffer = new byte[1024];
  • int length;
  • while ((length = myInput.read(buffer))>0){
  • myOutput.write(buffer, 0, length);
  • }
  •  
  • //Close the streams
  • myOutput.flush();
  • myOutput.close();
  • myInput.close();
  •  
  • }
  •  
  • public void openDataBase() throws SQLException{
  •  
  • //Open the database
  • String myPath = DB_PATH + DB_NAME;
  • myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  •  
  • }
  •  
  • @Override
  • public synchronized void close() {
  •  
  • if(myDataBase != null)
  • myDataBase.close();
  •  
  • super.close();
  •  
  • }
  •  
  • @Override
  • public void onCreate(SQLiteDatabase db) {
  •  
  • }
  •  
  • @Override
  • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  •  
  • }
  •  
  • // Add your public helper methods to access and get content from the database.
  • // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
  • // to you to create adapters for your views.
  •  
  • }
  • To je to.

    Sada možete da kreirate novu instancu ove DataBaseHelper klase i pozovete createDataBase() i openDataBase() metode. Nemojte da zaboravite da promenite "YOUR_PACKAGE" u imenskom prostoru vašeg paketa aplikacija (npr. com.imeprimera.myapp) u DB_PATH stringu.

    ...

     
  • DataBaseHelper myDbHelper = new DataBaseHelper();
  • myDbHelper = new DataBaseHelper(this);
  •  
  • try {
  •  
  • myDbHelper.createDataBase();
  •  
  • } catch (IOException ioe) {
  •  
  • throw new Error("Unable to create database");
  •  
  • }
  •  
  • try {
  •  
  • myDbHelper.openDataBase();
  •  
  • }catch(SQLException sqle){
  •  
  • throw sqle;
  •  
  • }
  •  
  • ...




  • Published (Last edited): 09-05-2013 , source: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/