2010-11-15 68 views
1

我最近3個小時試圖完成此任務。我正在製作一個應用程序,該應用程序將隨裝載填充表的數據庫一起發佈,而這些表在客戶端設備上不會更改 我設法做到這一點,把它放在資產文件夾中,並將其作爲一個字節流複製到手機上的相應數據文件夾。問題是當我想更新數據庫時,我無法使它工作。我從電話(從代碼)中刪除數據文件夾中的數據庫,但複製新數據庫總是失敗,或者複製的數據庫具有適當的大小,但沒有表格。 如何做到這一點?還是有更簡單的方法?我可以直接從資產中打開數據庫嗎(如果可以的話,它會是最簡單的方式,但我無法找到如何從代碼訪問資產的路徑)?在Android中更新預填充的數據庫

+0

「但始終複製新數據庫失敗」 - 請界定「總是失敗」。 「我可以直接從資產中打開數據庫嗎?」 - 不,抱歉。 – CommonsWare 2010-11-16 02:07:46

回答

4

這裏是我使用的代碼:

public class DataBaseHelper extends SQLiteOpenHelper { 

    private static final String DB_PATH = "/data/data/com.project.mydb/databases/"; 
    private static final String DB_NAME = "mydb.db"; 
    private static final String DB_TABLE = "words"; 
    private static final int DB_VERSION = 6; 
    private static final String TAG = "DataBaseHelper"; 
    int id = 0; 
    Random random = new Random(); 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 

    public DataBaseHelper(Context context){ 
     super(context, DB_NAME, null, DB_VERSION); 
     this.myContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db){ 
     createDB(); 
    } 

    @Override 
    public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion){ 
     Log.w(TAG, "Upgrading DB from version " + oldVersion + " to " + 
       newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); 
     onCreate(db); 
    } 

    public void createDataBase(){ 
     createDB(); 
    } 

    private void createDB(){ 
     boolean dbExist = dbExists(); 
     if(!dbExist){ 
      copyDataBase(); 
     } 
     else if(dbExist){ 
      copyDataBase(); 
     } 
    } 

    private boolean dbExists(){ 
     SQLiteDatabase db = null; 
     try{ 
      String dbPath = DB_PATH + DB_NAME; 
      db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); 
      db.setLocale(Locale.getDefault()); 
      db.setLockingEnabled(true); 
      db.setVersion(DB_VERSION); 
     } 
     catch(SQLiteException e){ 
      Log.e("SQL Helper", "database not found"); 
     } 
     if(db != null){ 
      db.close(); 
     } 
     return db != null ? true : false; 
    } 

    private void copyDataBase(){ 
     InputStream iStream = null; 
     OutputStream oStream = null; 
     String outFilePath = DB_PATH + DB_NAME; 
     try{ 
      iStream = myContext.getAssets().open(DB_NAME); 
      oStream = new FileOutputStream(outFilePath); 
      byte[] buffer = new byte[1024]; 
      int length; 
      while((length = iStream.read(buffer))>0){ 
       oStream.write(buffer,0,length); 
      } 
      oStream.flush(); 
      oStream.close(); 
      iStream.close(); 
     } 
     catch(IOException ioe){ 
      throw new Error("Problem copying database from resource file."); 
     } 
    } 

    public void openDataBase() throws SQLException { 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

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

這個答案是輕微錯誤的:刪除這些行'else if(dbExist){copyDataBase(); }或者即使已經存在,db也會被複制。 – 2015-09-02 09:54:39

相關問題