Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use an existing database with an Android application [duplicate]

I have already created an SQLite database. I want to use this database file with my Android project. I want to bundle this database with my application.

Instead of creating a new database, how can the application gain access to this database and use it as its database?

like image 871
Muhammad Umar Avatar asked Feb 02 '12 08:02

Muhammad Umar


People also ask

How do I connect an Android app and website with same database?

Originally Answered: How do I link the same database with the web and an Android application? Write an API/Rest layer for the database and let both the web and android app connect to the API/Rest layer.

Where are Android app database stored?

But by default all the android application store database on internal storage path /data/data/<application_package_name>/databases . And its applicable for all devices rooted or un-rooted.

What is the best database for Android applications?

PostgreSQL. A unique relational database, PostgreSQL is the best database for Android and iOS apps. Developers can customize this database as they want; that's why it's the most preferred mobile app database.


1 Answers

NOTE: Before trying this code, please find this line in the below code:

private static String DB_NAME ="YourDbName"; // Database name 

DB_NAME here is the name of your database. It is assumed that you have a copy of the database in the assets folder, so for example, if your database name is ordersDB, then the value of DB_NAME will be ordersDB,

private static String DB_NAME ="ordersDB"; 

Keep the database in assets folder and then follow the below:

DataHelper class:

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;  import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;  public class DataBaseHelper extends SQLiteOpenHelper {      private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window     private static String DB_NAME ="YourDbName"; // Database name     private static int DB_VERSION = 1; // Database version     private final File DB_FILE;     private SQLiteDatabase mDataBase;     private final Context mContext;      public DataBaseHelper(Context context) {         super(context, DB_NAME, null, DB_VERSION);         DB_FILE = context.getDatabasePath(DB_NAME);         this.mContext = context;     }      public void createDataBase() throws IOException {         // If the database does not exist, copy it from the assets.         boolean mDataBaseExist = checkDataBase();         if(!mDataBaseExist) {             this.getReadableDatabase();             this.close();             try {                 // Copy the database from assests                 copyDataBase();                 Log.e(TAG, "createDatabase database created");             } catch (IOException mIOException) {                 throw new Error("ErrorCopyingDataBase");             }         }     }      // Check that the database file exists in databases folder     private boolean checkDataBase() {         return DB_FILE.exists();     }      // Copy the database from assets     private void copyDataBase() throws IOException {         InputStream mInput = mContext.getAssets().open(DB_NAME);         OutputStream mOutput = new FileOutputStream(DB_FILE);         byte[] mBuffer = new byte[1024];         int mLength;         while ((mLength = mInput.read(mBuffer)) > 0) {             mOutput.write(mBuffer, 0, mLength);         }         mOutput.flush();         mOutput.close();         mInput.close();     }      // Open the database, so we can query it     public boolean openDataBase() throws SQLException {         // Log.v("DB_PATH", DB_FILE.getAbsolutePath());         mDataBase = SQLiteDatabase.openDatabase(DB_FILE, null, SQLiteDatabase.CREATE_IF_NECESSARY);         // mDataBase = SQLiteDatabase.openDatabase(DB_FILE, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);         return mDataBase != null;     }      @Override     public synchronized void close() {         if(mDataBase != null) {             mDataBase.close();         }         super.close();     }  } 

Write a DataAdapter class like:

import java.io.IOException; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log;  public class TestAdapter {      protected static final String TAG = "DataAdapter";      private final Context mContext;     private SQLiteDatabase mDb;     private DataBaseHelper mDbHelper;      public TestAdapter(Context context) {         this.mContext = context;         mDbHelper = new DataBaseHelper(mContext);     }      public TestAdapter createDatabase() throws SQLException {         try {             mDbHelper.createDataBase();         } catch (IOException mIOException) {             Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");             throw new Error("UnableToCreateDatabase");         }         return this;     }      public TestAdapter open() throws SQLException {         try {             mDbHelper.openDataBase();             mDbHelper.close();             mDb = mDbHelper.getReadableDatabase();         } catch (SQLException mSQLException) {             Log.e(TAG, "open >>"+ mSQLException.toString());             throw mSQLException;         }         return this;     }      public void close() {         mDbHelper.close();     }       public Cursor getTestData() {          try {              String sql ="SELECT * FROM myTable";              Cursor mCur = mDb.rawQuery(sql, null);              if (mCur != null) {                 mCur.moveToNext();              }              return mCur;          } catch (SQLException mSQLException) {              Log.e(TAG, "getTestData >>"+ mSQLException.toString());              throw mSQLException;          }      } } 

Now you can use it like:

TestAdapter mDbHelper = new TestAdapter(urContext); mDbHelper.createDatabase(); mDbHelper.open();  Cursor testdata = mDbHelper.getTestData();  mDbHelper.close(); 

EDIT: Thanks to JDx

For Android 4.1 (Jelly Bean), change:

DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 

to:

DB_PATH = context.getApplicationInfo().dataDir + "/databases/"; 

in the DataHelper class, this code will work on Jelly Bean 4.2 multi-users.

EDIT: Instead of using hardcoded path, we can use

DB_PATH = context.getDatabasePath(DB_NAME).getAbsolutePath(); 

which will give us the full path to the database file and works on all Android versions

like image 141
Yaqub Ahmad Avatar answered Oct 16 '22 22:10

Yaqub Ahmad