Android 更新SQLite数据库不正确

Android 更新SQLite数据库不正确,android,android-sqlite,updating,sqlite,Android,Android Sqlite,Updating,Sqlite,我开发了一个在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.s

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

现在,在更新应用程序时,我应该如何删除旧版本的数据库并将新数据库从资产文件夹复制到设备中


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

您可以使用以下代码作为帮助:

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();
}
}
希望这对您有所帮助。

您的oncreate()应该是:

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

CreateDataBase()类似于:

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

然后就可以了。

你的两个答案似乎马上就被@ManojFegde接受了,实际上没有什么可补充的。如果你是同一个人,你就做错了。你可以拥有多个账户,但不可以以一种与声誉系统博弈的方式行事。
public void createDataBase(){
    boolean dbExist = dbExists();
    if(!dbExist){
        copyDataBase();
    }
    else if(dbExist){
        copyDataBase();
    }
}