如何检查 Android SQLite 数据库中是否存在表?

2023-11-23

我有一个android应用程序,需要检查数据库中是否已有记录,如果没有,则处理一些事情并最终插入它,如果数据确实存在,则只需从数据库中读取数据。我正在使用 SQLiteOpenHelper 的子类来创建并获取 SQLiteDatabase 的可重写实例,我认为如果表尚不存在,它会自动创建表(因为执行此操作的代码位于 onCreate(... ) 方法)。

但是,当表尚不存在,并且在我拥有的 SQLiteDatabase 对象上运行的第一个方法是调用 query(...) 时,我的 logcat 显示错误“I/Database(26434): sqlite returned: error code = 1, msg = no such table: appdata",果然,appdata 表没有被创建。

有什么想法吗?

我正在寻找一种方法来测试表是否存在(因为如果不存在,则数据肯定不在其中,并且在写入之前我不需要读取它,这似乎创建了表正确),或者确保它被创建并且只是空的,及时第一次调用 query(...)

EDIT
这是在以下两个答案之后发布的:
我想我可能已经发现了问题。出于某种原因,我决定应该为每个表创建一个不同的 SQLiteOpenHelper,即使它们访问相同的数据库文件。我认为重构该代码以仅使用一个 OpenHelper,并在其 onCreate 中创建两个表可能会效果更好......


试试这个:

public boolean isTableExists(String tableName, boolean openDb) {
    if(openDb) {
        if(mDatabase == null || !mDatabase.isOpen()) {
            mDatabase = getReadableDatabase();
        }

        if(!mDatabase.isReadOnly()) {
            mDatabase.close();
            mDatabase = getReadableDatabase();
        }
    }

    String query = "select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'";
    try (Cursor cursor = mDatabase.rawQuery(query, null)) {
        if(cursor!=null) {
            if(cursor.getCount()>0) {
                return true;
            }
        }
        return false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Android SQLite 数据库中是否存在表? 的相关文章

随机推荐

  • 无法在 swift iOS 8 扩展中投射 UIImage

    我有一个奇怪的问题 我正在尝试构建一个操作扩展 该扩展将从提供的图像中扫描条形码 这是代码 override func viewDidLoad super viewDidLoad Get the item s we re handling
  • 使用带有附加参数的自定义规则验证 Laravel 中的数组

    我正在使用 Laravel 5 7 我需要使用 2 个输入 前缀 数字 来验证电话长度 总位数必须始终为 10 我正在将这个自定义规则用于其他运行良好的项目
  • 如何在命令行上从 COM exe 中提取 TypeLib

    我最近需要生成一个互操作程序集 经过一番谷歌搜索后我发现tlbimp exe 我的下一个问题是我的 COM 库没有附带 tlb文件 进一步的谷歌搜索显示 类型库通常作为资源包含在 exe dll 中 果然 在 VS2010 中打开 exe
  • 为什么不调用 Destroy?

    鉴于以下 Delphi 代码 Foo is Free d on FormClose but TFoo Destroy没有被调用 因此Bar is not Freed 导致内存泄漏 我是否在这里错过了一些东西 或者 Foo Free 在某个时
  • 定义和分配属性之间的区别

    为对象分配属性和定义属性有什么区别 哪一个更好以及如何实现 This Object defineProperty obj p propDesc 或者简单地 obj p someValue Object defineProperty让您可以设
  • 使用 $.post 将对象集合传递到 MVC 控制器

    我们正在尝试使用 json 和 jQuery post 函数将对象集合从我们的页面发送到您的控制器 MVC 3 下面是我们的 js 代码以及控制器和对象定义 问题是 当对象被适当地发送到我们的控制器时 它的成员变量没有被填充 Coords
  • jquery 调用命名函数的点击事件

    我有一个 jQueryonClick处理程序 用匿名函数编写 如下所示 selector on click function do something 我将概括在命名函数中提取逻辑的匿名函数 这促使我执行以下操作 selector on c
  • 链接批处理脚本时出现意外的双 & 符号/管道行为

    我的 foo bat 文件 exit b 1 我在cmd提示符下执行的内容 foo bat echo OK Result exit b 1 OK 然而 当我使用双管时 不会出现回声 foo bat echo OK Result exit b
  • 您将如何编写一种简单的编程语言? [复制]

    这个问题在这里已经有答案了 可能的重复 设计简单编程语言的方法 学习编写编译器 我想编写一种语法类似于 QBasic 但更简单的编程语言 我希望它适合初学者 它的简单性将鼓励有抱负的程序员不要放弃并让他们对编程产生兴趣 例如 代替 QBas
  • 如何确定子例程是否正在使用调用者的 eval 内调用?

    我仍在学习 Perl 我的任务是使用caller确定是否正在从某个子程序调用eval在任何更高的级别 我应该想出一些代码来测试它并打印Yes如果它来自eval or No如果不是的话 我找不到任何关于如何使用的好例子caller在网上 想知
  • 如何在 Windows XP 中的可执行文件上设置处理器关联?

    我有一个带有第三方应用程序的四核系统 偶尔会旋转多个进程 始终是相同的可执行文件 但有多个实例 并占用 100 的 CPU 时间 我还在同一个机器上运行了几个 Web 服务 IIS 和第三方 所有核心都繁忙的问题是 它会使第三方 Web 服
  • Visual Studio 2015 测试资源管理器看不到 XUnit dnx 特征

    Visual Studio 2015 测试资源管理器无法识别我的测试特征 当我将其添加到 DNX 项目中的测试时 Trait Category Test 该测试仍然显示在测试资源管理器中的 无特征 组下 按特征对测试进行分组时 看起来这已经
  • 避免“使用未分配的局部变量”错误

    我有两种与此等效的方法 请原谅这个人为的示例 public void WithResource Action
  • 从流启动进程

    我有一个包含 PDF 文件的内存流 是否可以在不保存到硬盘的情况下查看 PDF Process Start 仅采用路径而不采用流 谢谢 只能通过用 C 实现您自己的伪文件系统 以某种方式将其安装为 Windows 中的磁盘 并让它拦截打开的
  • 如何在家庭环境中使用化石 (DVCS)?

    我正在尝试将化石作为我的新版本控制系统 因为我是一个致力于小型项目的孤独开发人员 我开始测试化石 但遇到了一个 可能是主要的新手 问题 如何推送或拉取到另一个目录 这在 Hg 上很容易 Fossil pull 或push 命令需要URL 而
  • 带有 libxml 的 Swift 框架

    我有使用 KissXML Objective C 库的 Swift Framework 项目 KissXML 内部使用 libxml 当我构建 xcode 项目 Xcode 6 beta 5 时 出现以下错误 error
  • set_union 与多集容器?

    当一个或两个输入容器是具有重复对象的多重集时 算法 std set union 的返回是什么 傻瓜会迷路吗 我们假设例如 multiset
  • 使用 Smtp.mail.microsoftonline.com 发送电子邮件

    上下文 我们是一家小公司 没有 Exchange Server 或任何专用服务器 但我们仍然需要拥有 发送电子邮件 我们决定使用微软在线服务 MOS 目标 我们有一个 Web 服务器 带有 IIS 6 0 的 Windows Server
  • 自定义 Laravel Passport 响应未经身份验证

    目前 我使用 Laravel 中使用护照功能制作的 api 具有登录 注册 更新和删除功能 使用此 api 插入数据和从数据库获取数据一切正常 现在我想知道 当令牌过期时 如何自定义 api 的响应 令牌的过期也正常工作 它会自动显示此消息
  • 如何检查 Android SQLite 数据库中是否存在表?

    我有一个android应用程序 需要检查数据库中是否已有记录 如果没有 则处理一些事情并最终插入它 如果数据确实存在 则只需从数据库中读取数据 我正在使用 SQLiteOpenHelper 的子类来创建并获取 SQLiteDatabase