在SQLite中,给出了这个数据库模式
CREATE TABLE observations (
src TEXT,
dest TEXT,
verb TEXT,
occurrences INTEGER
);
CREATE UNIQUE INDEX observations_index
ON observations (src, dest, verb);
Run Code Online (Sandbox Code Playgroud)
每当有一个新的观察元组(:src, :dest, :verb)出现时,我想要为该元组的现有行增加"出现次数"列,或者如果还没有,则添加一个出现次数= 1的新行.在具体的伪代码中:
if (SELECT COUNT(*) FROM observations
WHERE src == :src AND dest == :dest AND verb == :verb) == 1:
UPDATE observations SET occurrences = occurrences + 1
WHERE src == :src AND dest == :dest AND verb == :verb
else:
INSERT INTO observations VALUES (:src, :dest, :verb, 1)
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以在一个SQLite语句中执行整个操作.这将简化应用程序逻辑(这需要与数据库操作完全异步),并且还避免使用完全相同的密钥进行双索引查找.INSERT OR REPLACE似乎不是我想要的,唉没有UPDATE …
假设我有一个包含A,B,C,D列的表,我想在A列和C列上进行匹配
我看到你可以匹配sqlite中的单个列或所有列,即
- match column A
select * from table where A match 'cat'
- match all columns
select * from table where table match 'cat'
Run Code Online (Sandbox Code Playgroud)
是否可以只匹配A列和C列?如果没有,你们怎么解决这个问题?
谢谢你的建议!
我知道SQL中的一些解决方案,但是从SQlite找不到任何解决方案.
我只想执行一个select查询,返回一个从1到100的数字结果集.
Numbers
1
2
3
4
......
5
Run Code Online (Sandbox Code Playgroud)
更正:我根本没有桌子.(但是像dualMySQL 这样的虚拟表鼓励使用解决方案)
我正在开发一个使用SQLite作为后端的Android应用程序.
我想确保数据库中的所有表都使用UTF-8.我怎样才能做到这一点?
我试过了:
CREATE TABLE myTable (_all_columns_definitions_) DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
但是出现了语法错误.
我很好奇是否有人在查询ContentProvidervia ContentResolvervs SQLiteDatabase在同一进程中查询对象时进行了任何性能测试.我猜测ContentResolver查询会传回一个通过Binder(Android IPC)与数据库通信的Cursor.这意味着如果我通过Cursor100个Binder方法调用读取100个记录的内容.我的猜测是否正确,如果是这样,那将比在同一过程中访问数据库慢得多?
代码优先:
create_table :users do |t|
...
t.boolean :is_active, :default => true
...
end
Run Code Online (Sandbox Code Playgroud)
现在,这是我的问题 - 我正在创建一个rake任务来导入大量的记录(10,000+).我已经做了大量的测试和基准测试,并确定执行此任务的最快和最有效的方法是创建一个巨大的原始SQL语句.(我正在从CSV读取数据).举个例子:
inserts = Array.new
FasterCSV.foreach(...) do |row|
inserts.push "(row[0], row[1]...)"
end
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}"
Run Code Online (Sandbox Code Playgroud)
一切都很好.整个过程在(字面上)秒内完成,而不是使用ActiveRecord完成1.5小时.但是,我的问题在于布尔字段.我在SQLite上本地开发,但是在生产中使用MySQL.当使用ActiveRecord时,Rails确定放在"布尔"字段中的内容(因为几乎所有数据库都不同).我正在编写自定义SQL,我想知道是否有办法可以做类似......
INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
Run Code Online (Sandbox Code Playgroud)
...正确返回特定于数据库的布尔值.
任何回答"只使用ActiveRecord"的人都将被拒绝投票.在这种情况下,这根本不可行.我也不愿意使用tinyint(1)字段并使用1或0.
总之,is_active需要根据当前数据库连接进行更改的值...
这甚至可能吗?
我目前正在开发一个有可能创建一个非常大的数据库的应用程序.我曾计划在SD卡上安装应用程序以增加一些空间.最近的交易警告我,这可能不是一个好主意.我是否可以采取任何措施来减轻这种行为的危险?还是有更好的选择吗?
我需要一种方法来安装或以某种方式访问adb shell中的sqlite3.我根植了我的设备.
我试图找到答案,但我可以接受的是: 当我尝试使用adb shell打开数据库时,为什么在root用户的Nexus One上出现"sqlite3:not found"错误?
但我不认为在Linux系统上推送我的Windows sqlite3.exe是个好主意?
那么有可能以某种方式安装sqlite3终端浏览器吗?
[解]
从#android-dev(irc)的不同评论和一些询问,我找到了一个解决方案.首先,我将数据库文件复制到我的桌面.但拳头我不得不安装BusyBox,因为不包括cp?!?在那之后,我遇到了一个问题,除了/ sdcard /之外我无法从任何地方拉或推.然后我可以使用/ sdcard /作为"中间站"并拉/推我的数据库.
然后我筋疲力尽!我真的不得不让我的sqlite终端探索.然后我有了启动模拟器从/ system/xbin/sqlite3中拉出sqlite二进制文件的想法.然后使用rw重新安装/系统:
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
Run Code Online (Sandbox Code Playgroud)
并将sqlite推送到/ sdcard /,并从那里将其复制到/ system/xbin/
现在它起作用了:D
我有一些奇怪的感觉abour sqlite3 参数,我想透露给你.
这是我的查询和失败消息:
#query
'SELECT id FROM ? WHERE key = ? AND (userid = '0' OR userid = ?) ORDER BY userid DESC LIMIT 1;'
#error message, fails when calling sqlite3_prepare()
error: 'near "?": syntax error'
Run Code Online (Sandbox Code Playgroud)
在我的代码中它看起来像:
// Query is a helper class, at creation it does an sqlite3_preprare()
Query q("SELECT id FROM ? WHERE key = ? AND (userid = 0 OR userid = ?) ORDER BY userid DESC LIMIT 1;");
// bind arguments
q.bindString(1, _db_name.c_str() …Run Code Online (Sandbox Code Playgroud) sqlite ×10
android ×4
sql ×3
activerecord ×1
adb ×1
boolean ×1
c ×1
c++ ×1
ipc ×1
parameters ×1
performance ×1