1

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

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 并安装在设备中。它替换了旧的应用程序并安装了新的应用程序,但数据库中所做的更改没有反映出来。

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

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

4

2 回答 2

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

希望这会帮助你。

于 2013-06-03T12:07:19.597 回答
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();
    }
}

然后它会正常工作。

于 2014-02-04T10:05:05.527 回答