2012-10-11 41 views
4

目前我擺弄自己在Android中使用SQL數據庫並創建我的第一個應用程序。現在我想更新這個應用程序和資產文件夾中的包含數據庫。我用新的數據覆蓋了舊的數據庫,但在我的手機上它並沒有顯示新的條目。只讀SQLite數據庫更新資產文件夾中的新應用程序版本

它以某種方式保存舊的條目/查詢或完全舊的Db。我檢查了網絡,但無法真正找到解決方案。在我的dbhelper代碼下面。我需要在onUpgrade中做些什麼或者該做什麼?

非常感謝您的幫助!

public class DataBaseHelper extends SQLiteOpenHelper { 
private static String DB_PATH; 

private static String DB_NAME; 

private SQLiteDatabase db_object; 

private final Context context; 

public DataBaseHelper(Context context, String db) { 
    super(context, db, null, 80); 
    this.context = context; 
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
// DB_PATH = "/data/data/com.comp.appname/databases/"; 
    DB_NAME = "mydatabase.sqlite"; 
    try { 
     createDataBase(); 
    } catch (IOException ioe) { 
     throw new Error("Unable to create database"); 
    } 
    try { 
     openDataBase(); 
    } catch (SQLException sqle) { 
     throw sqle; 
    } 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
} 

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    if (dbExist) { 
    } else { 
     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_READONLY); 
    } catch (SQLiteException e) { 
    } 
    if (checkDB != null) { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException { 
    InputStream myInput = context.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

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

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

噢...好的。從DBMS刪除我們的舊數據庫並嘗試再次運行它 –

+0

對不起。那對我不明白。你能詳細說明一下嗎?你的意思是以編程方式刪除它? – SunnySonic

+0

好的。我想你是什麼意思,但如果我從日食中刪除它,它只會在我的手機上工作,但如果人們從市場更新我的應用程序,則不會。所以我需要一個無處不在的解決方案。 – SunnySonic

回答

1

我解決我自己的問題:

onUpgrade方法你需要把:

mycontext.deleteDatabase(DB_NAME); 

在databasehelper類我需要增加這樣的版本號,例如:

super(context, db, null, 84); 

與我是84,但基本上你只需要通過1遞增了,他說這是一個更高的版本。 Optimum會是,如果它確實是你的數據庫版本,你增加以及你的數據庫的每個外部編輯。

希望能幫助別人。

2

這裏是升級數據庫的代碼:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
if (newVersion > oldVersion) { 
    switch (oldVersion) { 
     case 1: 
      executeSQLScript(database, "update_v2.sql"); 
     case 2: 
      executeSQLScript(database, "update_v3.sql"); 
    } 
} 
} 

,也看看這個鏈接:http://www.drdobbs.com/database/using-sqlite-on-android/232900584?pgno=2

+0

我很抱歉。這也不起作用。 (只是爲了說明一點,導致它可能不清楚,我有一個數據庫與現有的表,我從資產讀取,每隔一段時間我添加新條目到這些表,並想更新應用程序,也許這有助於。 – SunnySonic

+0

我編輯我的答案,請檢查這項工作,並檢查鏈接也 –

+0

謝謝你的努力。事情是,雖然我不創建或操縱與java代碼表。我編輯數據庫分開,只是放下一個較新的版本到資產文件夾,因爲我只讀它,我可以刪除每個應用程序啓動數據庫,然後再次從資產文件夾複製,但這不是很實際。 – SunnySonic

相關問題