I've noticed in more than one SQLite tutorial that the table is recreated in the onCreate()
event of the class that extends SQLiteOpenHelper
. I've already created my SQLite database and tables outside the Android environment (Eclipse IDE) with the help of a Firefox add-in. The database tables reside in the expected spot:
C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets
It seems bizarre to me that I would have to recreate them programmatically each time (obviously, they continue to exist and retain data, or what would be the point)? However, I'm having a serious issue with this application right now which leads me to my question:
Much to my chagrin, I just realized that instead of creating my database tables in C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets
, I had put them in C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic\assets
, which was an earlier version of the application, yet copying the SQLite file to the proper location didn't change things a single bit. If this is what has been causing the problem, being that my application was looking for an AWOL database, is it not enough to simply copy and paste the file? Must I do something to officially
introduce the database to the system/Android/Eclipse
directory? Any suggestions?
Actually SQLiteOpenHelper
is responsible for your database creation, upgrade and many more.
If you want to create tables programmatic then you have to write a create tables queries in the onCreate method of the SQLiteOpenHelper
class.If you want to update your database after previously created database you can write the modified table's queries in the onUpgrade method only you will have to change the database version.
If you already created a database externally and if you want to use that database then you have to put that database in the assets folder and copy that file in the databases folder which is resides in the /data/data/packagename/databases
folder.
here is the example for copy database from assets to databases folder
private static boolean copyDataBase(Context c) throws IOException {
String DB_PATH = "/data/data/" + c.getPackageName() + "/databases/";
AssetManager mg = c.getResources().getAssets();
InputStream myInput = null;
try {
myInput = mg.open(DATABASE_NAME);
} catch (IOException ex) {
return false;
}
if (myInput != null) {
String outFileName = DB_PATH + DATABASE_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[8000];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
Log.d(TAG, "Database is copied");
return true;
}
return false;
}
Here is the method which check for the databases and its version for copy
public void copyDatabase() {
try {
SharedPreferences preferences = c.getSharedPreferences(c.getPackageName(), Context.MODE_PRIVATE);
if (checkDataBase(c)) {
if (preferences.getInt("dbversion", 0) != 0) {
c.deleteDatabase(DatabaseHelper.DATABASE_NAME);
}
}
getReadableDatabase();
close();
if (copyDataBase(c)) {
Editor editor = preferences.edit();
editor.putInt("dbversion", DatabaseHelper.DATABASE_VERSION);
editor.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Here is the example which check whether the database is already exists or not?
public static boolean checkDataBase(Context c) {
File f = new File("/data/data/" + c.getPackageName() + "/databases/"
+ DATABASE_NAME);
if (!f.exists())
return false;
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase
.openDatabase("/data/data/" + c.getPackageName()
+ "/databases/" + DATABASE_NAME, null,
SQLiteDatabase.OPEN_READONLY);
checkDB.close();
} catch (SQLiteException e) {
e.printStackTrace();
}
return checkDB != null ? true : false;
}