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

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掉。

### MySQL 创建数据库、用户以及授权 #### 数据库创建 在 MySQL 中,可以通过 `CREATE DATABASE` 命令来创建一个新的数据库。此命令允许指定字符集和排序规则以确保数据的一致性和兼容性。 以下是创建数据库的标准语法: ```sql CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 上述语句会检查是否存在同名数据库,如果不存在则创建数据库,并设置默认字符集为 `utf8mb4` 和排序规则为 `utf8mb4_general_ci`[^3]。 #### 用户的创建 为了增强安全性,在实际应用中通常不会直接使用 root 账户访问数据库实例。而是通过创建新的账户来进行管理或开发工作。下面展示了一个典型的例子: 假设我们需要建立一个名为 cloudmusic 的远程用户(可以从任何主机连接),密码设为 "cloud123!!!" ,可以执行以下 SQL 语句完成该任务: ```sql CREATE USER 'cloudmusic'@'%' IDENTIFIED BY 'cloud123!!!'; ``` 这里 `'%'` 表示这个用户的来源地址不受限,即可以从任意 IP 地址登录到服务器上[^1]。 #### 权限授予 一旦建立了相应的数据库和用户之后,就需要赋予这些新建用户足够的权限去操作他们负责的数据资源。比如给上面提到过的 cloudmusic 这个用户分配特定数据库上的增删改查等基本权利,则可以用如下指令实现: ```sql GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON 数据库名.* TO '用户名'@'host'; FLUSH PRIVILEGES; ``` 其中 FLUSH PRIVILEGES 是为了让更改立即生效而必需的一个步骤[^4]。 以上就是关于如何在 MySQL 环境里构建自己的专属空间——包括定义个性化存储区域(也就是我们常说的“数据库”);引入外部访客身份认证机制("用户");最后再根据实际情况调整其活动范围内的功能许可程度("授权")的整体流程概述。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值