如何升级用户 phone 中的 sqlite 数据库

how to upgrade sqlite database in user's phone

我正在尝试通过向现有数据库添加更多数据来升级 sqlite 数据库。数据库安装在用户 phone 上。我的数据库版本当前是 1,正在尝试升级到 2。我没有创建 onCreate 方法,因为我已经在资产文件夹中有 sqlite 数据库,该文件夹已经由其他应用程序创建。我是 sqlite 的新手。我用谷歌搜索了这个错误,但我不知道如何解决这个错误。任何帮助将不胜感激。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.donghyouny.biblecard, PID: 10475
    java.lang.IllegalStateException: getDatabase called recursively
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:431)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:391)
        at com.donghyouny.biblecard.MyDatabaseHelper.insertToBible(MyDatabaseHelper.java:68)
        at com.donghyouny.biblecard.MyDatabaseHelper.onUpgrade(MyDatabaseHelper.java:62)
class MyDatabaseHelper extends SQLiteOpenHelper {

    private Context context;
    private static final String DATABASE_NAME = "bible.db";
    private static final int DATABASE_VERSION = 2;

    private static final String TABLE_SAVE = "save";
    private static final String TABLE_BIBLE = "bible";
    private static final String COLUMN_ID = "_id";
    private static final String COLUMN_TIMESTAMP = "TimeStamp";
    private static final String COLUMN_BIBLETYPE = "BibleType";
    private static final String COLUMN_VERSE = "Verse";
    private static final String COLUMN_CONTENT = "Content";
    private static final String COLUMN_NUM = "Num";
    private static final String COLUMN_CNUM = "CNum";
    private static final String COLUMN_CHECKNUM = "CheckNum";
    private static final String COLUMN_IMAGE = "Image";
    private static final String COLUMN_BIBLEID = "BibleId";

    MyDatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
       if(oldversion==1){
           insertToBible("Bible", "Psalm 1,1-2", "I am the way and truth",9, 3,  0, imageViewToByte(28));
       }
    }

    void insertToBible(String bibleType, String verse, String content, int num, int cnum, int checknum, byte[] image){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();

        cv.put(COLUMN_BIBLETYPE, bibleType);
        cv.put(COLUMN_VERSE, verse);
        cv.put(COLUMN_CONTENT, content);
        cv.put(COLUMN_NUM, num);
        cv.put(COLUMN_CNUM, cnum);
        cv.put(COLUMN_CHECKNUM, checknum);
        cv.put(COLUMN_IMAGE, image);
        cv.put(COLUMN_TIMESTAMP, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        long result = db.insert(TABLE_SAVE,null, cv);
        if(result == -1){

        }else {

        }
    }

更改 insertToBible() 的签名以包含 SQLiteDatabase 的实例作为第一个参数并删除:

SQLiteDatabase db = this.getWritableDatabase();

所以是这样的:

void insertToBible(SQLiteDatabase db, String bibleType, String verse, String content, int num, int cnum, int checknum, byte[] image)

调用时使用 onUpgrade()SQLiteDatabase:

实例
insertToBible(db, "Bible", "Psalm 1,1-2", "I am the way and truth",9, 3,  0, imageViewToByte(28));