更新SQLite数据库没有反映

时间:2013-06-01 07:48:43

标签: android android-sqlite updating sqlite

我开发了一个在assets文件夹中有数据库的应用程序。数据库副本在运行时从assets文件夹复制到设备。代码如下:

public class DataBaseHelperClass extends SQLiteOpenHelper{
private final Context context;

private static String DB_PATH = "";
// Data Base Name.
private static final String DATABASE_NAME = "db.sqlite";
// Data Base Version.
private static final int DATABASE_VERSION = 1;
// Table Names of Data Base.
static final String TABLE = "MyTable";

static SQLiteDatabase sqliteDataBase;

@SuppressLint("SdCardPath")
public DataBaseHelperClass(Context context) {       
    super(context, DATABASE_NAME, null ,DATABASE_VERSION);
    this.context = context;
    //The Android's default system path of your application database.
    DB_PATH =  "/data/data/com.abc.myapp/databases/";
}

public void createDataBase() throws IOException{
    //check if the database exists
    boolean databaseExist = checkDataBase();

    if(databaseExist){
        this.getWritableDatabase();
    }else{
        this.getReadableDatabase(); 
        copyDataBase(); 
    }// end if else dbExist
} // end createDataBase().

public boolean checkDataBase(){
    File databaseFile = new File(DB_PATH + DATABASE_NAME);
    return databaseFile.exists();        
}

private void copyDataBase() throws IOException{ 
    //Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DATABASE_NAME); 
    // Path to the just created empty db
    String outFileName = DB_PATH + DATABASE_NAME; 
    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName); 
    //transfer bytes from the input file to the output file
    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 + DATABASE_NAME;
    sqliteDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);  
}

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

 @Override
public void onCreate(SQLiteDatabase db) {
    // No need to write the create table query.
    // As we are using Pre built data base.
    // Which is ReadOnly.
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}   

此代码工作正常。但现在我对数据库进行了一些更改:

我在数据库中创建了一个新表

更改记录并在现有表中添加记录。

并将数据库助手类的onUpdate更改为:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(newVersion > oldVersion){
        //db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);
        context.deleteDatabase(DATABASE_NAME);
    }
}

将数据库版本从1增加到2。

生成新的apk并安装在设备中。它取代了旧的应用程序并安装了新的应用程序,但数据库中的更改并未反映出来。

现在,我应该怎么做才能删除旧版本的数据库,并在更新应用程序时将资产文件夹中的新数据库复制到设备中。

请指导我这个问题,因为我在Google上搜索了这个问题,但没有得到任何有效的解决方案来删除和更新新的数据库。

2 个答案:

答案 0 :(得分:2)

您可以将此代码用作以下帮助:

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

希望这会对你有所帮助。

答案 1 :(得分:0)

你的oncreate()应该是:

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

OnUpgrade()是:

@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion){
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
    onCreate(db);
}

CreateDataBase()就像:

public void createDataBase(){
    boolean dbExist = dbExists();
    if(!dbExist){
        copyDataBase();
    }
    else if(dbExist){
        copyDataBase();
    }
}

然后它会正常工作。