按照书上的代码仔细核对后,发现代码应该是没有问题的,只是无法查看表,在网上看见有人说使用版本低一点的模拟器就能解决这个问题,我试了一下,确实可以,这个是API 22的模拟器生成的databases文件夹下的文件截图
图一
生成的这种类型的文件,直接导出 .db 文件就可以在可视化工具中查看,并且这种情况和书上的也是一样的。
然后再放一张一开始我使用的模拟器(API28)生成的databases文件夹下的文件截图
在这里插入图片描述
从上图可以看到,在这个模拟器上生成的数据库文件是3个,这是因为在 Android 9 上,App的SQLite日志模式预设采用SQLite在3.7.0版加入的WAL (Write-Ahead Logging)模式。

第一张图SQLite使用rollback journal机制实现原子事务,rollback journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。

第二张图采用WAL机制,WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行,默认是在WAL文件积累到1000页修改的时候;当然,在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口。执行checkpoint之后,WAL文件会被清空。

现在我遇到的问题就是WAL文件并没有同步到DB文件,但是在这种情况下我们依旧是可以通过可视化工具查看数据库的数据,方法如下:
在这里插入图片描述
这是stackoverflow上给出的一个回复,简单概括就是在使用可视化工具查看数据库的时候,不应该只导出 .db 文件,应该连同 .db-wal 文件一起复制到工具中。这种方法确实是可行的。

经过上面的分析我们知道,当在Android 9 的设备上使用SQLite出现找不到表的问题的时候,可以有以下解决方法

1. 关闭WAL模式

两种方式:
(1)

   @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        //禁用WAL
        db.disableWriteAheadLogging();
    @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
        //禁用WAL
        db.disableWriteAheadLogging();

2.手动执行CheckPoint

如何手动执行checkpoint,看SQLiteDatabase.endTransaction源码:

* End a transaction. See beginTransaction for notes about how to use this and when transactions * are committed and rolled back. public void endTransaction() { verifyLockOwner(); try { ... if (mTransactionIsSuccessful) { execSQL(COMMIT_SQL); // if write-ahead logging is used, we have to take care of checkpoint. // TODO: should applications be given the flexibility of choosing when to // trigger checkpoint? // for now, do checkpoint after every COMMIT because that is the fastest // way to guarantee that readers will see latest data. // but this is the slowest way to run sqlite with in write-ahead logging mode. if (this.mConnectionPool != null) { execSQL("PRAGMA wal_checkpoint;"); if (SQLiteDebug.DEBUG_SQL_STATEMENTS) { Log.i(TAG, "PRAGMA wal_Checkpoint done"); // log the transaction time to the Eventlog. if (ENABLE_DB_SAMPLE) { logTimeStat(getLastSqlStatement(), mTransStartTime, COMMIT_SQL); } else { ... } finally { mTransactionListener = null; unlockForced(); if (false) { Log.v(TAG, "unlocked " + Thread.currentThread() + ", holdCount is " + mLock.getHoldCount());

也就是当我们执行endTransaction时会提交checkpoint。

3.更多没有试验的方法

参考文章链接:
https://www.sqlite.org/appfileformat.html
https://blog.csdn.net/degwei/article/details/9708339
https://blog.csdn.net/ws6013480777777/article/details/86493094

按照书上的代码仔细核对后,发现代码应该是没有问题的,只是查看表的时候是空的,一开始使用的是as中的插件DataBase Navigatoer,我还在想是不是自己之前没有用过这个插件,不会操作导致的,后来使用SQLite Expert Professional发现依旧是空的,然后在网上看见一个人说使用版本低一点的模拟器就能解决这个问题,我试了一下,真的可以,这个是API 22的模拟器生成的database文件夹下的文件截图生成的这种类型的文件,直接导出.db文件就可以在可视化工具中查看,并且这两种文件和书
1 public class MyDBHelper extends SQLiteOpenHelper { 2 //数据库文件在SD卡,此时必须用全限定名!! 默认路径在/data/data/databases/testDBinSD.sqlite, 但私密数据外界看不到-除非root。 3 private static final String SQL_NAME = ...
查询语句名写错了 数据库语句字段是忽略大小写的,但是在Linux下名是区分大小写的 我由于数据库是在Linux上的所以遇到了名大小写不对应而不到数据库的问题。 将名改为小写就可以查询的到 还有一个方法就是用root帐号登录后,在/etc/my.cnf的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分名的大小写;
在命令提示符不到sql执行的结果 ​ 在Qt代码经过if判断测试.exec()执行过的sql是执行成功的但是在命令提示符查询不到建立的table等信息。 ​ 原因:sqlite 和mysql,Oralce等大型数据库不同,sqlite是轻量级的数据库,每个建立的数据库都默认存放在自己工程的目录下,可以在终端打开数据库时候指定他的路径,比如 sqlite3 /home/kylin/***/*.db 附加一条sqlite的命令: 获取sqlite所有列信息:(列名,列内容) PRAGMA ta
使用SQLite时,继承SQLiteOpenHelper, onCreate方法只有在第一次创建数据库的时候才会被调用, 因此,重新更改或者添加时,需要在DDMS里面删掉原来的.db文件,重新运行,就可以~ 补充知识:Android studio sqllite数据库操作关于创建和无法插入数据时的注意事项以及解决 创建的sql语句 1.如果有条件的话。最好使用sqllite expert编辑代码测试,再复制到Android studio 2.如果没有的话就要注意数据类型(integer、text、float等)前面一定要有一个空格否则 属性名就会变成**“KEY_IDInteger
LINQ转DB LINQ to DB是最快的LINQ数据库访问库,在POCO对象和数据库之间提供了一个简单,轻便,快速且类型安全的层。 从体系结构上讲,它比Dapper,Massive或PetaPoco之类的微型ORM领先一步,因为您可以使用LINQ达式(而不是魔术字符串),同时在代码和数据库之间保持一薄层抽象层。 您的查询由C#编译器检查,并允许轻松进行重构。 但是,它不如LINQ to SQL或Entity Framework重。 没有变更跟踪,因此您必须自己进行管理,但从积极的方面来看,您可以更好地控制和更快地访问数据。 换句话说, LINQ to DB是类型安全SQL 。 linq2db是一个项目。 开发版nuget ( ) 丰富查询API: (除了标准LINQ语法。) 可扩展性: 请访问我们的并查看以获取更多详细信息。 代码示例和演示可以在或在到。 相关的linq2db和第三方项目 (在EF.Core项目添加了对linq2db功能的支持) 著名的开源用户: (从v4.30开始)-流行的开源电子商务解决方案 从数据库上下文创建
SQLite是一个轻量级的关系型数据库管理系统,它支持SQL语言,可以在多个平台上运行,并且可以嵌入到其他应用程序,因此非常受欢迎。要创建和连接SQLite数据库文件,只需要几个简单的步骤: 首先,下载并安装SQLite软件包。SQLite官方网站为用户提供了多个版本的SQLite软件包,可根据自己的操作系统和需要下载并安装。 其次,在终端或命令行打开SQLite控制台。这可以通过在命令行输入“sqlite3”命令来完成。 接下来,在SQLite控制台输入“.open”命令,后跟您想要连接的数据库文件的名称。如果文件不存在,则将创建一个新文件,并打开它以供您使用。 之后,您可以使用常用的SQL语句创建数据,插入数据,查询数据等等。例如,您可以使用“CREATE TABLE”命令创建新数据,使用“INSERT INTO”命令插入新数据,使用“SELECT”命令查询数据等等。 最后,在完成所有的数据操作后,可以使用“.exit”命令退出SQLite控制台,或者使用“.save”命令将数据保存到数据库文件。 总之,使用SQLite创建和连接数据库文件非常简单和方便,通过SQL语言进行数据读写操作更是非常灵活和高效。如果您需要管理小型数据库,例如移动应用程序使用的本地存储,SQLite无疑是最佳的选择之一。