Copying Database from assets folder to database folder
Hi I'm working with this code http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ and it's working fine, except that I'm getting a java.io.filenotfoundexception on this line
OutputStream myOutput = new FileOutputStream(outFileName);
I also tried this instead
OutputStream myOutput = this.context.openFileOutput(outFileName, Context.M开发者_运维知识库ODE_PRIVATE);
and I got
java.lang.IllegalArgumentException: File /data/data/com.kosherapp/databases/applicationdata contains a path separator
Anyone have any ideas for me? Thanks in advance!
This example uses SQLiteAssetHelper in the newer version the main class has a variable ASSET_DB_PATH :
public class SQLiteAssetHelper extends SQLiteOpenHelper {
private static final String ASSET_DB_PATH = "databases";
So you don´t need to specify in your class that extends from SQLiteAssetHelper
the path of your database including the directory
// private static final String DATABASE_NAME = "databases/myadtabase.db";
private static final String DATABASE_NAME = "mydatabase.db";
So instead of having:
"databases/databases/mydatabase.db"
you will have the correct path:
"databases/mydatabase.db"
Thats the reason for what you have this error:
java.lang.IllegalArgumentException: File ............ contains a path separator
DatabaseHelper myDbHelper = new DatabaseHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
myDbHelper.close();
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String TAG = "DatabaseHelper";
private static String DB_PATH = "/data/data/com.test/databases/";
private static String DB_NAME = "testdb.sqlite";
public static final int DB_Version = 1;
private final Context myContext;
private static SQLiteDatabase myDB;
DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_Version);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
onCreate(db);
}
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");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
// database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
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 SQLiteDatabase openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
return myDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if (myDB != null)
myDB.close();
super.close();
}
}
As per the docs, The name you supply to openFileOutput
can't contain a path seperator. It must be a file name only (this is to prevent you from attempting to write outside of your application's sandbox). Looking at your error message:
java.lang.IllegalArgumentException: File /data/data/com.kosherapp/databases/applicationdata contains a path separator
Try using "applicationdata.db" as the file name by itself.
Android 1.6 doesn't need you to specify the URL, just give name of database and your are all set to go. :)
精彩评论