复制数据库文件夹到数据库文件夹

问题描述:

嗨 我这个代码 http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 和它的正常工作,除了工作是我在这一行复制数据库文件夹到数据库文件夹

OutputStream myOutput = new FileOutputStream(outFileName); 

得到一个java.io.filenotfoundexception我也试过这个代替

OutputStream myOutput = this.context.openFileOutput(outFileName, Context.MODE_PRIVATE); 

和我

java.lang.IllegalArgumentException: File /data/data/com.kosherapp/databases/applicationdata 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(); 
} 
} 

我已经做了轻微的修改,以从该链接中找到的代码.. 只是参考此链接的答案。你可能会得到答案。 Database not copying from assets

+0

哪里是在区别码?我没有发现它... – 2011-05-16 14:03:31

+0

检查出checkdatabase()和copydatabase()方法... – 2011-05-16 14:52:14

+1

再次,我没有看到它,而不是暗示,你能告诉我吗?checkdatabase()中的 – 2011-05-16 14:58:27

根据docs,您提供给openFileOutput的名称不能包含路径分隔符。它只能是一个文件名(这是为了防止你试图在应用程序的沙箱外写入)。看看你的错误信息:

java.lang.IllegalArgumentException: File /data/data/com.kosherapp/databases/applicationdata contains a path separator

尝试使用“applicationdata.db”作为文件名本身。

+0

我想到了,但是我怎么知道它被复制到哪里,因为我需要从中读取数据,我可以告诉它复制到数据库文件夹吗? – 2011-05-16 14:26:40

Android 1.6不需要你指定URL,只需给出数据库的名称,你的所有设置都将被设置。 :)

example使用SQLiteAssetHelper在新版本的主类具有可变ASSET_DB_PATH:

public class SQLiteAssetHelper extends SQLiteOpenHelper { 


    private static final String ASSET_DB_PATH = "databases"; 

这样您便不会需要你的类,从SQLiteAssetHelper的路径延伸到指定数据库包括目录

// private static final String DATABASE_NAME = "databases/myadtabase.db"; 
    private static final String DATABASE_NAME = "mydatabase.db"; 

因此,而不是具有:

"databases/databases/mydatabase.db" 

,你将有正确的路径:

"databases/mydatabase.db" 

enter image description here


那是什么你有这个错误的原因:

java.lang.IllegalArgumentException: File ............ contains a path separator