无法在deleteDatabase后创建同名数据库

本文探讨了在Android开发中遇到的一个奇怪问题:使用deleteDatabase删除SQLite数据库后,登录时出现无法预料的行为和错误。文章提供了详细的解决方案,包括在删除数据库前关闭所有相关连接的方法。

Android开发,遇到一个奇怪的问题,在应用退出的时候,使用deleteDatabase删除sqlite数据库。

然后登录的时候,出现类似os_unix.c stat(/data/data/org.ibuo.demo/databases/demo.db) 

 android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802)的错误。


后来在google code发现已经有人提出了同样的问题:

https://code.google.com/p/android/issues/detail?id=13727

Reported by  jschn...@gmail.comJan 5, 2011
This happened with multiple android versions and devicesI was developing on...

I attempted to clear the database when logging out of our app in two different ways:
1.  Deleting the file under "data/data/MY_APP/databases" directly
2.  Using context.deleteDatabase();

Both of these resulted in the file seeming to be deleted from the file system (it did not show up when listing files from an adb shell).

When logging back in however, the old data was still available, and there was no db file created on the file system.  SQLiteDatabase.getPath showed we were still looking at the same location however.  Using lsof, I determined that the file handle still existed.

This is unusual behavior which I would not have expected from the built in Context.deleteDatabase() method, and at least requires some explanation in the docs.

Workaround: 
I solved my problem by dropping all of the tables in the db and setting the version back to 0 instead of using Context.deleteDatabase().
=======================

是说被删除的文件的句柄还没有释放。后来用了其他的方法绕过去了这个问题。


在调试的过程中发现,SDK 2.2,2.3会出现数据库已删除,但是却能读出文件的问题。

而4.1,4.2,会直接报错。提示找不到文件的错误。

然后应用会重启,重启后,却可以了。


解决办法:

在deleteDatabase前,把同一句柄的db close掉。

### 如何在 Navicat Premium 中创建数据库表 #### 使用图形界面创建表格 通过Navicat Premium的直观用户界面,可以轻松地设计新的数据表。启动应用程序并连接至目标数据库之后,在左侧的对象窗格里定位到想要操作的具体数据库节点下展开它。右键点击“表(Table)”选项随后选择新建表命令[^1]。 此时会出现一个新的窗口用于定义新表的各项属性: - **字段设置**:在此处添加每一列的信息,包括但不限于名称、所采用的数据类型以及是否允许为空等特性。 - **索引配置**:能够设定主键和其他类型的索引以优化查询性能。 - **外键关联**:如果业务逻辑涉及到多个表之间的关系,则可在这里规定相应的参照完整性约束条件。 完成上述各项参数填写确认无误后保存即可成功构建一张全新的数据表[^3]。 #### 利用SQL语句创建表格 对于熟悉SQL语法的技术人员来说,直接编写脚本也是一种高效的方式。同样是在已经建立了有效链接的前提下切换到Query Editor标签页内输入如下所示的标准DDL(Data Definition Language)指令来实现相同目的[^4]: ```sql -- 展现当前服务器上的全部数据库列表供参考选用 SHOW DATABASES; -- 创建名为example_db的新数据库实例(假设之前不存在同名者) CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE example_db; -- 定义一个简单的员工信息记录表employee_info CREATE TABLE employee_info ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), hire_date DATE, salary DECIMAL(10,2), department_id INT UNSIGNED, INDEX idx_department (department_id), -- 添加部门ID作为辅助检索路径提高效率 FOREIGN KEY fk_dept(department_id) REFERENCES departments(id) ON DELETE RESTRICT ON UPDATE CASCADE -- 设定对外部表departments中id字段值的一致性检验机制 ); ``` 以上两种途径均能达成预期效果即建立起结构化的存储单元以便后续录入具体事务详情。值得注意的是实际应用场景往往更加复杂因此可能还需要考虑更多细节因素比如字符集的选择、默认值赋予策略等方面的内容。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值