嗨,我目前正在开发语言词典应用程序。该数据库来自我手动输入的SQLite db。该应用程序的功能是用户可以询问列表中未添加的任何单词,因此每次应用程序更新时,我都必须手动更新数据库。

问题是,每次我更改数据库数据时,列表都不会更新,当我更改版本号时,应用程序崩溃了。

我该如何解决这个问题?那里的教程仅显示如何在实时输入或添加列上进行操作,而主要仅用于添加行和已存在的数据库上。谢谢。

这是我的DataBaseHelper类

public class DataBaseHelper extends SQLiteAssetHelper {

    private static final String DB_Name = "kamus_db";
    private static final int DB_VER = 1;

    private static final String TB_DATA = "tb_data";
    private static final String COL_ID = "_id";
    private static final String COL_TURKI = "turki";
    private static final String COL_ISTILAH ="istilah";
    private static final String COL_INDONESIA = "indonesia";

    private static DataBaseHelper dbInstance;
    private static SQLiteDatabase db;

    private  DataBaseHelper(Context ctx) {
        super(ctx, DB_Name, null, DB_VER);
    }

    static DataBaseHelper getInstance(Context ctx) {
        if (dbInstance == null) {
            dbInstance = new DataBaseHelper(ctx);
            db = dbInstance.getWritableDatabase();
        } return dbInstance;
    }

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

    List<Kamus> getAllKamus() {
        List<Kamus> kamusList = new ArrayList<>();

        Cursor cursor = db.query(TB_DATA, new String[] {
                COL_ID, COL_TURKI, COL_ISTILAH, COL_INDONESIA
        }, null, null, null, null, null);

        if (cursor.getCount() >= 1 ) {
            cursor.moveToFirst();

            do {
                Kamus kamus = new Kamus();
                kamus.setTurki(cursor.getString(cursor.getColumnIndexOrThrow(COL_TURKI)));
                kamus.setIstilah(cursor.getString(cursor.getColumnIndexOrThrow(COL_ISTILAH)));
                kamus.setIndonesia(cursor.getString(cursor.getColumnIndexOrThrow(COL_INDONESIA)));
                kamusList.add(kamus);
            } while (cursor.moveToNext());
        } return kamusList;
    }

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

        String TAG = "TAG";

        Log.w(TAG, "Upgrading database. Existing contents will be lost. ["
            + oldVersion + "] -> [" + newVersion + "]");

        db.execSQL("DROP TABLE " + TB_DATA);
        onCreate(db);

    }

}

最佳答案

使用SQLiteAssetHelper时,应参考ReadMe - Database Upgrades

您可能需要查看“通过覆盖升级”部分并调用setForcedUpgrade()方法(如果用户不更新数据库),这将用更新后的数据库替换数据库。

如果用户确实更新了数据库,那么需要完成的工作取决于所做的更改。您可能需要编写将保留数据的代码(如果需要)。

09-04 13:48
查看更多