attempt to write a readonly database 错误

本文详细解析了在使用SQLite数据库时遇到的attempttowriteareadonlydatabase错误的原因,并提供了解决方案。关键在于确保在访问数据库前添加了必要的权限,即在AndroidManifest.xml文件中添加<uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE/>。通过正确配置权限,可以避免此类错误的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次错误说明 并不是所有没在manifest中添加权限的错误都会在错误提示中提示出来的

attempt to write a readonly database 

错误是试图写数据到只读数据库

打开数据库的方法是这种

应该没错的

SQLiteDatabase db = SQLiteDatabase.openDatabase(Dir.dbPath, null,
				SQLiteDatabase.OPEN_READWRITE);

经过网上查找 在论坛发现错误原因是没加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />



### SQLite 'attempt to write a readonly database' 错误解决方案 当尝试向SQLite数据库写入数据时遇到 `attempt to write a readonly database` 的错误,通常是因为当前操作的数据库文件处于只读状态。以下是可能的原因以及对应的解决方法: #### 原因分析 1. **数据库路径问题**: 如果数据库文件位于只读目录下(如程序安装目录),则无法对其进行修改[^1]。 2. **权限不足**: 当前运行的应用程序没有足够的权限来更改该数据库文件[^3]。 3. **数据库未正确加载**: 可能存在数据库连接配置不正确的情况,导致实际使用的数据库是一个临时的只读版本[^4]。 #### 解决方案 ##### 方法一:将数据库移动至可写的存储位置 对于 UWP 或其他现代应用框架,建议将数据库文件复制到应用程序的本地文件夹 (`LocalFolder`) 中再进行操作。这可以有效避免因为系统保护机制而导致的只读问题。 ```csharp // C# 示例代码:将数据库文件复制到 LocalFolder using Windows.Storage; using System.IO; async Task CopyDatabaseToLocalStorage() { string sourcePath = "Assets/mydatabase.db"; // 源数据库路径 StorageFile dbSourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx://{sourcePath}")); string destinationPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "mydatabase_local.db"); await dbSourceFile.CopyAsync(ApplicationData.Current.LocalFolder, "mydatabase_local.db", NameCollisionOption.ReplaceExisting); } ``` ##### 方法二:调整文件访问权限 如果目标设备允许手动设置文件权限,则可以通过提升权限的方式解决问题。例如,在 Android 平台上通过修改外部存储器上的数据库文件属性实现。 注意:此方式适用于某些特定环境下的开发调试阶段;生产环境中应优先考虑更安全的方法。 ##### 方法三:验证并修正 SQLite 连接字符串 确保用于建立数据库链接的 URI 参数包含了必要的标志位以支持读写模式。例如在 C# WinForms 应用中使用如下格式定义连接串[^5]: ```csharp string connectionString = @"Data Source=|DataDirectory|\mydatabase.db;Version=3;"; connectionString += ";Journal Mode=Wal"; connectionString += ";Cache Size=-10000"; connectionString += ";Synchronous=Normal"; connectionString += ";Read Only=False"; // 显式声明为非只读模式 ``` 另外需要注意的是调用 `sqlite3_open()` 函数初始化数据库实例时也要确认其参数是否指定了正确的文件名及路径。 --- ### 总结 上述三种途径分别针对不同场景提供了可行的技术手段去克服 SQLite 数据库仅限于阅读而不能编辑的情形。具体采用哪一种取决于项目需求与部署平台特性等因素影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值