2011-05-16 160 views
1

嗨 我這個代碼 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

任何人對我有任何想法? 在此先感謝!

回答

0
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(); 
} 
} 
0

我已經做了輕微的修改,以從該鏈接中找到的代碼.. 只是參考此鏈接的答案。你可能會得到答案。 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

0

根據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

0

Android 1.6不需要你指定URL,只需給出數據庫的名稱,你的所有設置都將被設置。 :)

0

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

相關問題