开发者

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"

Copying Database from assets folder to database folder


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. :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜