2013-01-17 67 views
2

中。在這個時候我這樣做:如何在資產文件夾中保存.db或.sqlite文件中的DataBase.db或.sqlite文件在android

@Override 
    public void onCreate(SQLiteDatabase db) { 
     mDatabase = db; 

      SQLiteDatabase.openOrCreateDatabase("assets/"+DATABASE_NAME+".db", null); 

     mDatabase.execSQL(FTS_TABLE_CREATE); 


    } 

但openOrCreateDatabase給出錯誤。我嘗試使用.db和.sqlite,但錯誤是一樣的。

+0

http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android-application/9109728#9109728 –

回答

6

無法從資產打開數據庫 - 您需要先將其複製到本地存儲。

+1

好的。你可以請給任何代碼溶膠或鏈接從我可以undertsand更多 – User42590

+0

http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard給出了一個例子,如果你看看接受的答案。您將主要需要'copyFile()'方法,因爲您已經知道要複製的文件的名稱。您也可以複製到安全存儲而不是sdcard:創建輸出流時只需省略'/ sdcard /'+。 – 323go

1

您必須在數據庫文件夾中第一次檢查日數據庫(沒什麼)

,那麼你必須複製.db的或.sqlite數據/數據/數據庫文件夾 並不僅僅是u能打開數據庫

這裏是我的示例代碼來做到這一點:

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    //boolean dbExist = false; 
    if (dbExist) { 
     // do nothing - database already exist 
    } else { 

     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 

} 

// this method will check the existance of database 
private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 

    String myPath = DB_PATH + DB_NAME; 
    try { 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READONLY); 
    } catch (Exception e) { 

    } 

    if (checkDB != null) { 
     checkDB.close(); 
    } 

    return checkDB != null ? true : false; 
} 

// copy the database file from asset folder to the DDMS database folder 
private void copyDataBase() throws IOException { 
    // Open your local db as the input stream 
    InputStream myInput = _context.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(); 
} 

// open the database 
public boolean openDataBase() throws SQLException { 
    String mPath = DB_PATH + DB_NAME; 
    // Log.v("mPath", mPath); 
    db = SQLiteDatabase.openDatabase(mPath, null, 
      SQLiteDatabase.CREATE_IF_NECESSARY); 
    return db != null; 
} 
+0

謝謝。但實際上我想獲得這個.db文件並將其放入我的資產文件夾。我想附加.db文件與我的.apk – User42590

+1

因此,您必須手動將.db文件複製到您的資產文件夾 – GOLDEE

+0

yah buit我必須訪問此文件,我不知道如何。如果可能,請回答我的這個問題http://stackoverflow.com/questions/14373380/how-to-attach-db-file-with-another-apk-android – User42590

2

在這裏,我給你完整的代碼,PLZ回覆,如果你成功

public class DataBaseHelper extends SQLiteOpenHelper{ 
private Context mycontext; 

private String DB_PATH = "/data/data/gr.peos/databases/"; 
//private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; 
private static String DB_NAME = "BLib.sqlite";//the extension may be .sqlite or .db 
public SQLiteDatabase myDataBase; 
/*private String DB_PATH = "/data/data/" 
          + mycontext.getApplicationContext().getPackageName() 
          + "/databases/";*/ 

public DataBaseHelper(Context context) throws IOException { 
    super(context,DB_NAME,null,1); 
    this.mycontext=context; 
    boolean dbexist = checkdatabase(); 
    if(dbexist) 
    { 
     //System.out.println("Database exists"); 
     opendatabase(); 
    } 
    else 
    { 
     System.out.println("Database doesn't exist"); 
    createdatabase(); 
    } 

} 

public void createdatabase() throws IOException{ 
    boolean dbexist = checkdatabase(); 
    if(dbexist) 
    { 
     //System.out.println(" Database exists."); 
    } 
    else{ 
     this.getReadableDatabase(); 
    try{ 
      copydatabase(); 
     } 
     catch(IOException e){ 
      throw new Error("Error copying database"); 
     } 
    } 
} 
private boolean checkdatabase() { 
    //SQLiteDatabase checkdb = null; 
    boolean checkdb = false; 
    try{ 
     String myPath = DB_PATH + DB_NAME; 
     File dbfile = new File(myPath); 
     //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE); 
     checkdb = dbfile.exists(); 
    } 
    catch(SQLiteException e){ 
     System.out.println("Database doesn't exist"); 
    } 

    return checkdb; 
} 
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("/data/data/gr.peos/databases/BLib.sqlite"); 

    // transfer byte to inputfile to 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 void opendatabase() throws SQLException 
{ 
    //Open the database 
    String mypath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE); 

} 



public synchronized void close(){ 
    if(myDataBase != null){ 
     myDataBase.close(); 
    } 
    super.close(); 
} 

謝謝。

相關問題