【问题标题】:how to upgrade my database using SQLiteAssetHelper using onUpgrade() method?如何使用 onUpgrade() 方法使用 SQLiteAssetHelper 升级我的数据库?
【发布时间】:2017-08-29 12:25:09
【问题描述】:

我正在使用 SQLiteAssetHelper 类构建一个带有预加载数据库问题的测验应用程序。我的应用程序运行良好,数据库中已有 300 个问题测验。但我不知道如何升级数据库(向表中添加新的测验问题,而不是更改结构或删除旧表中保存的任何用户数据)。 我已经按照 GitHub 中 SQLiteAssetHelper 的文档中的描述安装了 SQLite compare,但它为我生成了一个空的 SQL 文件,我不知道为什么!所以我尝试了以下代码并尝试插入两行仅用于测试数据库是否会在我的 android 上从版本 1 升级到 2,但不幸的是,它没有帮助。我以这种形式到处查看,但与 SQLiteAsseHelper 类相关的信息很少而且不够清楚。这些天我正在完成我的测验应用程序,我在想如果我不能更新应用程序那它就没有用了。请告诉我如何在不更改以前存在的行的情况下将新行插入旧数据库,因为我保存用户在表格中的答案。

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class DatabaseOpenHelper extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "quizMe_1.db";
    private static final int DATABASE_VERSION = 2;

    public DatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2){
        insertValues(db,"من اكثر فريق عالمي فوزا بكأس العالم ؟","فرنسا","ألمانيا","أيطاليا","البرازيل","0","4","0");
        insertValues(db,"نبي سميت سورة من القران بأسمه ؟","عيسى","موسى","إبراهيم","نوح","0","3","0");
    }
}

private static void insertValues(SQLiteDatabase db, String question,String ans1, String ans2, String ans3, String ans4,
                                 String right, String userAsn, String field) {
    ContentValues questionValues = new ContentValues();
    questionValues.put("question", question);
    questionValues.put("answer_1", ans1);
    questionValues.put("answer_2", ans2);
    questionValues.put("answer_3", ans3);
    questionValues.put("answer_4", ans4);
    questionValues.put("right_answer", right);
    questionValues.put("user_answer", userAsn);
    questionValues.put("field", field);
    db.insert("quiz", null, questionValues);
}


}

【问题讨论】:

  • 不完全是一个答案,但我想你会知道检查这个准备类似的查询并使用它来升级stackoverflow.com/questions/13041062/…
  • 除了“没有帮助”之外,具体的问题是什么?请注意,如果您安装一个全新的应用程序,它只会安装提供的数据库并且不会调用onUpgrade()。捆绑的数据库必须已经是最新版本。
  • 如果我将应用程序安装给新用户,那很好,因为应用程序也会预加载新数据库。但是如果用户已经安装了版本 1 并且他的数据库包含并保存了他对测验问题的正确和错误答案怎么办。在那个 senario 应用程序版本 2 中应该只将新的测验问题添加到他的数据库中,而不是删除、更改或添加任何东西。
  • 您的insertValues() 呼叫看起来不错。他们不工作吗?
  • 代码似乎没有被调用。 onUpgrade() 方法看起来还没有被调用。在 SqliteOpenHeplper 类中,您在 onCreate() 方法中调用 onUpgrade,但在这里我有这个扩展 SQLiteOpenHelper 类的 SqliteAssetHelper 类

标签: android database sqlite


【解决方案1】:

我不确定我们是否可以更新资产文件夹中的数据库文件,但我希望我可以给你一个调试解决方案的想法。在尝试以下解决方案之前,我们需要确保数据库文件中的值是否可以更新。为此,通过代码更新表中的值并对其进行测试。例如:在您的测验应用程序中更改问题 1 的答案,并通过运行应用程序检查值是否已更新。如果值已更新,那么我们也可以插入新值,然后尝试以下方法,否则我们无法更新数据库文件中的值。

希望您知道 onUpgrade mehtod 只有在我们更新应用程序时才会被调用,即从较低版本到最新版本。我不确定你是如何测试你的代码的,如果你用下面的方式测试过,请忽略它,否则试试。首先从 playstore 下载并安装应用程序,然后生成最新版本的签名 apk(确保数据库版本已更新)安装 apk 在 onupgrade 方法中放入 toast 并检查它是否符合条件。如果出现吐司,请检查您的插入代码,否则更改条件如下并试一试

if(newVersion == 2)

希望这有帮助:)

【讨论】:

  • 我没有尝试更新以前的数据库版本中的任何数据,我只在用户进行测验和回答时更新它们。如果他是正确的,那么我在指定的原始测验的“user_answer”字段中写 1。我正在寻找如何通过发布新版本向数据库添加行或数据或测验问题。我的应用还没有出现在 Play 商店中,所以我只能使用 android studio 和我的 android 手机来获得解决方案。
  • 是的,我做了 Toast.makeText(cn,"onUpgrade called",Toast.LENGTH_SHORT).show();它显示了消息,但没有将两行添加到数据库中
  • @SamiKassoum:: 检查insert方法是否被调用?
  • 我查过了,它也被调用了。现在我真的不知道为什么添加的两个行不会出现在数据库中?
  • @SamiKassoum:我怀疑您无法将新值插入到资产文件夹中的数据库文件中。stackoverflow.com/a/8700478/1501864
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多