升级时创建表

2024-02-07

我一直在努力解决这个问题,但我不知道我错过了什么。我有一个 Android 应用程序,我希望再添加 1 个表。但是我无法做到这一点,而且我也没有例外(不喜欢这些无声杀手!!)。

下面是我的 SQLiteHelper 类的代码

public class DbCreator extends SQLiteOpenHelper {

public DbCreator(Context context) {

    super(context, Constants.DB_NAME, null, Constants.NEW_VERSION);//NEW_VERSION=2

    this.myContext = context;
}

//Rest of code

//Checks if DB is present and create if reqd.
public void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();
    if (dbExist) {
        // do nothing - database already exist
    } else {

        // By calling this method and empty database will be created into
        // the default system path
        // of your application so we are gonna be able to overwrite that
        // database with our database.
        this.getReadableDatabase();

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database : " + e);

        }
    }

}

    //Check DB is present
    private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
        String myPath = Constants.DB_PATH + Constants.DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);

    } catch (SQLiteException e) {
        Log.v("DB", "No DB");
        // database does't exist yet.

    }

    if (checkDB != null) {

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

/**
 * Copies your database from local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = myContext.getResources().openRawResource(
            R.raw.diary_database);

    // Path to the just created empty db
    String outFileName = Constants.DB_PATH + Constants.DB_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();

}

    //**This is the problem area
    @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Constants.log(TAG, "Upgrading started..."+db.getVersion() );
    if (db.getVersion() == Constants.OLD_VERSION) {
            db.beginTransaction();
        Constants.log(TAG, "Upgrading started...transaction");
        db.execSQL("create TABLE Thought(  StartDate DATETIME, Content TEXT, EndDate DATETIME, Title TEXT )");
        db.setVersion(Constants.NEW_VERSION);//NEW_VERSION=2
            db.endTransaction();
        Constants.log(TAG, "Upgrading started...transaction finished");

    }

}

最糟糕的是我看到所有日志都在发生,甚至当我在控制台上执行查询时查询也成功运行。


Edits

我的数据库没有更新:-

我已经从模拟器中提取了我的数据库,甚至看到版本号中的日志没有更改。我在我的活动中使用以下行来查看数据库版本。

DbCreator dbCr = new DbCreator(this);
SQLiteDatabase myDataBase = dbCr.getMyDatabase();
Constants.log(TAG, "Db Version : "+myDataBase.getVersion());

我强烈鼓励您切换到SQLiteAssetHelper https://github.com/jgilfelt/android-sqlite-asset-helper,它已经解决了整个应用程序中的数据库包模式。

从战术上讲,您并没有提交交易。多语句事务的正确配方是:

try {
  db.beginTransaction();

  // do SQL here

  db.setTransactionSuccessful();
}
finally {
  db.endTransaction();
}

如果没有setTransactionSuccessful() call, endTransaction()将做一个ROLLBACK.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

升级时创建表 的相关文章

  • 如何获取每个StorageVolume的可用大小和总大小?

    背景 谷歌 悲伤 计划破坏存储权限 https www xda developers com android q storage access framework scoped storage 这样应用程序将无法使用标准文件 API 和文件
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • sqlite 列名称引用(功能或错误)

    我遇到了一些对我来说看起来很奇怪的东西 但可能是我滥用了 sqlite3 create table t v 0 text insert into t values aa select from t v aa pragma table inf
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • 除了动态参数和可选参数之外,C# 4.0 还有哪些新功能?

    所以 C 4 0 昨天出来了 它引入了备受争议的dynamic关键字 命名参数和可选参数 较小的改进是隐含的ref识别 COM 方法上的索引属性和默认属性 逆变和协变 实际上是 NET CLR 功能 不仅仅是 C 以及 真的是这样吗 是dy
  • 找出 Uneaten Leaves 算法错误

    我在面试挑战中遇到了这个问题 K 条毛毛虫正在吃掉 N 片叶子 每条毛毛虫 以独特的顺序从一片叶子落到另一片叶子 所有毛毛虫都开始 在位置 0 处的树枝上 并落在位置之间的叶子上 1 和 N 每条毛毛虫 j 都有一个关联的跳跃数 Aj A
  • 由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver?

    我正在使用 Pony ORM 作为烧瓶解决方案 并且遇到了以下问题 考虑以下 db session def get orders of the week self user date q select o for o in Order fo
  • 同步块和监视器对象

    您好 有人可以解释一下下面的代码中的同步代码是否会限制对线程的访问 如果是的话 它与我们使用 this 而不是 msg 作为监视对象有什么不同 public void display String msg synchronized msg
  • 使用 C 中的 GLib/GIO 从 Web 获取文件

    我应该使用什么函数使用 GLib GIO 库从网络获取文件 如果我的文件来自 gchar path http xxx yyyServer sharing temp txt 我应该怎么做才能下载它 对于本地文件 我只使用 fopen 和 fr
  • 理解Python内存分配和释放

    我最近遇到本文 http deeplearning net software theano tutorial python memory management html关于python内存分配 在这个页面中 它描述了 python 的内存使
  • 在 R 中进行矩阵乘法时的非一致性数组

    我正在尝试在 R 中实现内核岭回归 公式为 alpha lt lambda I K 1 y 拉姆达 0 1 I 与 K 大小相同的单位矩阵 y 是与 K 具有相同行数的特征向量 所以我在 R 中尝试了这个 I lt diag nrow df
  • 如何将 AWS Glue 作业的输出返回到调用 Step Function 工作流程?

    AWS Step Functions 允许调用 AWS Glue 作业 如下所述 https docs aws amazon com step functions latest dg connect glue html https docs
  • 合并冲突解决

    当 Git 中出现合并冲突时 如下所示的垃圾会被插入到冲突的文件中 三个问题 你如何阅读这些注释 解决这些合并冲突时可以使用哪些策略 是否有适用于 Mac 的 GUI 工具知道如何读取这些文件并并排显示两个版本 以便更轻松地解决问题 注意
  • 如何从 Composer 中全局删除包?

    我运行此命令进行全局安装PHPUnit composer global require phpunit phpunit 3 7 现在我想全局卸载PHPUnit 有任何想法吗 要删除全局安装的包 请运行 composer global rem
  • 如何保持 ARKit SCNNode 就位

    嘿 我正在想办法 如何保持简单节点的位置 当我在 ARKit 中绕着它走动时 Code func renderer renderer SCNSceneRenderer didAdd node SCNNode for anchor ARAnc
  • 有没有一种简单的方法来枚举 Base 中数组的索引?

    有时人们想要循环遍历数组的索引 例如 假设我想创建一个嘈杂的乘法表 首先 创建一些噪音 julia gt m 0 1 rand 2 3 2 3 Matrix Float64 0 0692654 0 0297861 0 0642931 0 0
  • Android-相对布局中ScrollView中的LinearLayout

    我的布局有点问题 我制作了RelativeLayout 其中放置了两个LinearLayout 1 和2 并在它们之间放置了带有LinearLayout 的ScrollView 接下来 我将 ScrollView 设置为放置在 Linear
  • Int64 创建数字范围

    我需要能够创建顺序长度超过 19 位的数字范围 我尝试使用 Enumerable Range 120000003463014 50000 ToList 这适用于较小的数字 但使用上面的代码时 我收到一条错误消息 指出它对于 int32 数字
  • SQL Server 2008根据机器设置获取DATETIMEOFFSET

    在 SQL Server 2008 R2 上 我有以下 T SQL 代码 SELECT CAST GETDATE AS DATETIMEOFFSET 这给了我如下结果 2011 12 26 10 21 13 7970000 00 00 但结
  • Apache Camel onException

    我想捕获路由中的所有异常 我添加这个 OnException onException Exception class process new MyFunctionFailureHandler stop 然后 我创建 MyFunction F
  • Heroku 与 NodeMailer 的问题

    我在 Heroku 上使用 Nodemailer 时遇到问题 非常感谢您的帮助 我的应用程序的先前版本曾经在 Heroku 上运行没有问题 当我回滚到该版本时 它仍然运行良好 在该应用程序的最新版本中 我没有对访问 Nodemailer 的
  • 在 iOS 中播放简单音效的最佳方法

    我发现许多有关在 iOS 中播放声音的相互矛盾的数据 每次用户触摸屏幕时仅播放简单的 ping 声音片段的推荐方法是什么 我用这个 头文件 import
  • 为什么“pip show”或“pip list”对我不起作用?

    蟒蛇的pip正在为我安装和更新软件包 但一些记录的命令似乎不受支持 至少在 OS 10 8 2 和 Python 2 7 2 上运行 1 2 1 时 当我尝试时 pip list or pip show
  • 升级时创建表

    我一直在努力解决这个问题 但我不知道我错过了什么 我有一个 Android 应用程序 我希望再添加 1 个表 但是我无法做到这一点 而且我也没有例外 不喜欢这些无声杀手 下面是我的 SQLiteHelper 类的代码 public clas