我有一个问答游戏,我把高分和问题放在数据库的不同表中,我使用下面的数据库适配器。如果我用更多的问题更新数据库,它会覆盖数据库,所以它也会用高分来更新数据库。我如何才能保持与高得分的表,使球员不失去它,并更新只有问题表?

public class AnyDBAdapter {

private static final String TAG = "AnyDBAdapter";
private DatabaseHelper mDbHelper;
private static SQLiteDatabase mDb;

private static String DB_PATH = "/data/data/xx.xxxxx.xxxx/databases/";
private static final String DATABASE_NAME = "dbname";

private static final int DATABASE_VERSION = 1;

private final Context adapterContext;

public AnyDBAdapter(Context context) {
    this.adapterContext = context;
}

public AnyDBAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(adapterContext);

    try {
        mDbHelper.createDataBase();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        mDbHelper.openDataBase();
    } catch (SQLException sqle) {
        throw sqle;
    }
    return this;
}

public void close() {
    mDbHelper.close();
}

private static class DatabaseHelper extends SQLiteOpenHelper {

    Context helperContext;

    DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        helperContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading database!!!!!");
        //db.execSQL("");
        onCreate(db);
    }

    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();
        SQLiteDatabase db_Read = null;
        if (dbExist) {
        } else {
            db_Read = this.getReadableDatabase();
            db_Read.close();
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    public SQLiteDatabase getDatabase() {
        String myPath = DB_PATH + DATABASE_NAME;
        return SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DATABASE_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 {

        // Open your local db as the input stream
        InputStream myInput = helperContext.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 inputfile to the outputfile
        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;
        mDb = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {

        if (mDb != null)
            mDb.close();

        super.close();

    }
}}

最佳答案

您的databasehelper需要实现onupgrade,而不是仅仅调用oncreate。您的代码:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(TAG, "Upgrading database!!!!!");
    //db.execSQL("");
    onCreate(db);
}

相反,在您已注释掉的db.execsql行中编写一些sql来修改所需的表。操作系统将向您传递旧版本和新版本,以便您可以进行修改。请记住,这仅适用于架构更改。如果数据库保持相同的结构,但只是添加数据,则除了向表中添加新数据外,不要执行任何操作。

关于android - 在升级Android时保持数据库中的表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9840354/

10-11 20:05
查看更多