将SQLite数据库模式更改为可读写
如何将SQLite数据库从只读更改为读写?
当我执行更新声明时,我总是得到:
SQL错误:试图写一个只读数据库
SQLite文件是文件系统上的可写文件。
这个错误信息可能有几个原因:
-
有几个进程同时打开数据库( 参见FAQ )。
-
有一个插件来压缩和encryption数据库。 它不允许修改数据库。
-
最后, 另一个FAQ说:“确保包含数据库文件的目录也可以写入执行CGI脚本的用户。” 我想这是因为引擎需要在目录中创build更多的文件。
如果使用Android。
确保你已经添加了写入你的EXTERNAL_STORAGE
的权限到你的AndroidManifest.xml
。
将此行添加到您的<application>
标记之上和之外的AndroidManifest.xml
文件中。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这将允许您的应用程序写入SD卡。 如果您的EXTERNAL_STORAGE
是您将数据库存储在设备上的地方,这将有所帮助。
我通过将所有者从根目录更改为/ db目录上的所有文件来解决此问题。
只要在该文件夹上执行ls -l
,如果任何文件pipe理器由root
拥有,只需将其更改为你,使用: sudo chown user file
我今天也有这个问题。
它是由Windows Mobile上的ActiveSync造成的 – 我工作的文件夹被同步,因此AS进程不时抓住数据库文件导致这个错误。
在Linux命令行程序中,我做了:
chmod 777 <db_folder>
其中包含数据库文件。
有用。 现在我可以访问我的数据库并进行插入查询。
从命令行input数据库文件所在的文件夹并执行以下命令:
chmod 777 databasefilename
这将授予所有用户的所有权限。
当您的数据库已经被一个应用程序访问时,通常会发生这个错误,而您正尝试使用另一个数据库访问它。
在Linux上,给包含数据库文件的整个文件夹提供读/写权限。
另外,SELinux可能会阻止写入。 您需要设置正确的权限。
在我的SELinuxpipe理界面(在Fedora 19上),我在标有httpd_unified(Unify HTTPD处理所有内容文件)的行上勾选了一个框,我很高兴。
在Windows上:
tl; dr:尝试再次打开文件。
我们的系统遇到了这个问题,而且这绝对不是一个权限问题,因为程序本身可以在大多数时间从多个线程中打开数据库,但是偶尔(仅在Windows上,而不是在OSX上),即使程序中的所有其他线程都没有问题,线程也会得到这些错误。
我们最终发现那些失败的线程只是在另一个线程closures之后(3毫秒内)试图打开数据库的线程。 我们推测这个问题是由于Windows(或windows下的sqlite实现)在closures文件时并不总是立即清理文件资源。 我们通过在打开时对数据库运行testing写查询来解决这个问题(例如,创build一个愚蠢的名字,然后删除一个表)。 如果创build/删除失败,我们等待50毫秒,然后重试,重复,直到成功或5秒过去。
有效; 显然只需要有足够的时间将资源刷新到磁盘。
编辑数据库:编辑数据库时遇到问题。 我结束了不得不
sudo chown'非root用户名'ts3server.sqlitedb
只要它不是根,我可以编辑文件。 用户名是我的非根帐户的用户名。
自动启动TeamSpeak: 作为你的非root账户
crontab -e
@reboot / ts3server的path/ aka /home/ts3server/ts3server_startscript.sh启动
在Ubuntu上,将所有者更改为Apache组并授予正确的权限(不,不是777):
sudo chown :www-data <path to db.sqlite3> sudo chown 664 <path to db.sqlite3>