我想在sqlite数据库中删除或添加列
我正在使用以下查询来删除列.
ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
System.Data.SQLite.SQLiteException: SQLite error
near "DROP": syntax error
Run Code Online (Sandbox Code Playgroud) 谁能告诉我SQLITE支持ANDROID的DATATYPES列表.
我想确认TIME和DATE数据类型.
# sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3: not found
Run Code Online (Sandbox Code Playgroud) 我已经使用Android 5.0 Lollipop升级了我的Nexus 7,在此之前我的应用程序与SQLite数据库配合得很好但是现在每当我执行任何类型的查询时,它都会给我发送log cat错误,例如:
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on …Run Code Online (Sandbox Code Playgroud) 在测试我的Android 5.0兼容应用程序时,我发现了这一点 一 我的两个SQL查询 不在棒棒糖上不再按预期工作了.与旧的Android版本相比,我的两个问题导致Lollipop的结果显着不同.
下面,我将更深入地描述这些问题及其解决方案,以防您遇到类似问题.
我的主要问题很简单:这些非向后兼容的变更是否记录在案?
似乎以下查询在Lollipop上不再起作用:
SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH '*ads*');
Run Code Online (Sandbox Code Playgroud)
它不再返回任何结果,在它之前的Lollipop上(当然使用相同的数据库和相同的数据).
例如,如本问题所述,MATCH仅匹配字符串前缀.事实确实如此,搜索词前面的'*'在Android <5.0时被忽略了.
然而,Lollipop的SQLite不喜欢第一个'*',并且不会为此查询返回任何内容.我不得不将查询更改为以下内容以使其再次起作用:
SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH 'ads*');
Run Code Online (Sandbox Code Playgroud)
(我使用FTS3进行全文搜索.)
简短的故事: GROUPing BY由原始名称引用的别名列与ORDER BY一起使用特定于Android的"COLLATE LOCALIZED"会在Lollipop上引发错误,但适用于以前的版本.WTF!?:-)
很长的故事:
故事开始于一个非常大的自动生成的查询,因此我修改,简化并缩短了导致问题的部分.我知道查询没有多大意义,如下所示,但它证明了问题.
SELECT
inner.title AS title,
ltrim(inner.title, '*') AS title2
FROM
(SELECT types.text AS title FROM types) AS inner
GROUP BY inner.title
UNION SELECT
inner.title AS title,
ltrim(inner.title, …Run Code Online (Sandbox Code Playgroud) 我在升级应用程序以支持Android Lollipop时遇到问题.该应用程序实现了一个SyncAdapter,它通过内容提供程序在数据库上写入.同时,用户正在浏览应用程序的前端,其中加载程序从数据库中读取相同的数据.加载程序还可以监听数据更改.
现在,如果我在前Lollipop设备上运行该程序,一切正常,没有任何错误输出.
在Lollipop上,我收到以下logcat消息:
11:20:59.344 22341-22376/com.example.com E/SQLiteLog? (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog? (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog? (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog? (10) POSIX Error : 11 SQLite Error : 3850
Run Code Online (Sandbox Code Playgroud)
现在,来自SQLite文档:
(3850)SQLITE_IOERR_LOCK
SQLITE_IOERR_LOCK错误代码是SQLITE_IOERR的扩展错误代码,表示咨询文件锁定逻辑中的I/O错误.通常SQLITE_IOERR_LOCK错误表示获取PENDING锁定时出现问题.但是,它也可以指示Mac上使用的某些专用VFS上的各种锁定错误.一切似乎都在高水平上正常工作(即执行读取和写入)
和:
PENDING锁意味着持有锁的进程想要尽快写入数据库,并且只是等待所有当前的SHARED锁清除,以便它可以获得EXCLUSIVE锁.如果PENDING锁处于活动状态,则不允许对数据库使用新的SHARED锁,但允许继续使用现有的SHARED锁.
我知道SQLite版本已经被Lollipop中的几个主要版本更新了,所以我很容易认为错误是由于我无法隔离的SQLite的一些新行为.
但是,从更高级别的角度看,一切似乎都运行良好(App不会崩溃,执行读写操作,帧率不会下降 - 至少对人眼来说)但我不想忽略这个问题发布应用程序,直到我确定它不会导致数据损坏或麻烦.
也许我对棒棒糖关于锁和多进程数据库访问的一些重要更改缺失了,但我觉得这是一个关于Art/Dalvik域的较低级别的问题,因此必须在NDK上下文中修复.
有没有办法解决这个问题而不分发特定版本的SQLite?是否有任何清单/ SQLite选项来避免错误?
提前致谢
是否在Android版本中启用了SQLite3 FTS4?
我已经基于官方Android文档集成了搜索,我正在使用以下SQLite架构和查询:
CREATE VIRTUAL TABLE Search USING FTS3 (
_id,
name,
location
);
select * from Search where name MATCH ?
-- where ? is the user typed exact "query"
-- or if it doesn't have spaces or stars I append a star to search prefix: "query*"
Run Code Online (Sandbox Code Playgroud)
我想知道如何扩展它?允许以下内容:
说我有一些名为的物品:
当用户blah在搜索框中输入内容时,搜索结果会显示:
my
mfi
fan item,fanit,fit
我在数据库中有两个表:
现在,当删除或添加第一列的房间号时,我的第二个表也应该更新.我认为这可以用TRIGGER命令,但我不确定如何使用它.
通常我的create database语句是这样的:
private static final String DATABASE_CREATE_PATIENT_ID_TABLE =
"create table " + DATABASE_PATIENT_TABLE +
" (_id integer primary key autoincrement,"
+ "patient_number text not null, room_numbertext not null, " +
"patient_initial text not null);";
Run Code Online (Sandbox Code Playgroud)
现在当房间被删除或添加到第一个表中时,我的第二个表应该更新.
private static final String DATABASE_CREATE_NOTES_ID_TABLE =
"create table " + DATABASE_NOTES_TABLE +
" (_id integer primary key autoincrement," +
" room_number text not null, time_hour text not null, " +
"notes_hour text not null, today_date text not null);";
Run Code Online (Sandbox Code Playgroud)
最初我做的是比较两个表的内容.但是,当数据增加时,这肯定会导致性能问题.所以我偶然发现了TRIGGER的事情.我认为这可以解决我的问题,但我不知道我应该如何使用它.