我有一个使用SQLite的C++程序.我想将SQL查询存储在一个单独的文件中 - 纯文本文件,而不是源代码文件 - 但是将该文件嵌入可执行文件中,就像资源一样.
(这必须在Linux上运行,因此据我所知,我无法将其存储为实际资源,但如果它适用于Windows,那将是完美的.)
有没有简单的方法,或者它是否有效地要求我为Linux编写自己的资源系统?(很容易,但需要更长的时间.)
从现在开始应该使用核心数据作为带有sqlite单表数据库的小型iphone应用程序的包装器吗?
从现在开始使用它是不必要地使事情变得复杂还是好的做法?
所以我想保存一组有序的双值,我希望能够轻松地插入,检索或删除任何值.就这样,我使用的是一个ArrayList,我在其中定义了一个名为Doubles的类来存储double值.
如何将此arraylist存储在SQLite数据库的记录中?我的意思是......列类型应该是什么?可以吗?
我使用SQLite3进行开发,使用PostgreSQL进行部署.但是,我面临以下问题:
我的简单搜索使用SQLite3:
def self.search(search)
if search
find(:all, :conditions => ["style LIKE ? OR construction LIKE ?", "%#{search}%", "%#{search}%"])
else
find(:all)
end
end
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用PostgreSQL,我需要替换LIKEfor ILIKE来解决问题:
def self.search(search)
if search
find(:all, :conditions => ["style ILIKE ? OR construction ILIKE ?", "%#{search}%", "%#{search}%"])
else
find(:all)
end
end
Run Code Online (Sandbox Code Playgroud)
是否有"Ruby方式"在任何数据库中进行这些搜索?
编辑 - 基于您的答案我不相信我会找到一个通用的Ruby解决方案.
我也跟着Ruby on Rails的教程:学习的榜样导轨-由迈克尔·哈特尔,在最终的Gemfile显示这两个数据库...嗯,令人失望...
我sqlite在移动设备和我的数据库中使用本地数据库,我有日期字段列名RN_CREATE_DATE.我的RN_CREATE_DATE列值采用这种格式'dd-mm-yy HH:MM:SS',我想获取给定日期的数据.使用下面的数据库列和值尝试的确切查询是什么
**RN_CREATE_DATE
2012-07-27 11:04:34
2012-05-28 10:04:34
2012-07-22 09:04:34**
SELECT RN_CREATE_DATE
FROM DISPOSITION
WHERE RN_CREATE_DATE=strftime('%Y', '2012-07-28 12:04:34')
Run Code Online (Sandbox Code Playgroud)
但没有找到结果,只是帮我解决这个问题.
我们正在建设一个新的Web应用程序,将有一个数字,将涉及新的数据插入本地设备的离线的iPad/Android应用版本.因此,我们需要使用UUID来允许与master数据库进行必要的双向同步.为此,我们将UUID存储BINARY(16)为主键.
我在研究之后学到的问题是,非连续主键插入所需的时间会随着时间的推移而增加,并且这些插入会导致碎片化(如此处所述).好处AUTO_INCREMENT是新行通常只会添加到表的末尾,因此不会遇到UUID的速度问题.
我的问题是,使用AUTO_INCREMENT列作为主键,然后将UUID列作为非空唯一索引是否更好?据推测,这将具有顺序插入的速度优势,同时保留同步分布式数据库所需的必要UUID.
我可以看到的一个问题是UUID需要被用作对其他表的引用(使用外键约束)(即附加到检查的问题列表,而检查又连接到站点,所有这些都是参与插入,因此所有这些都需要UUID).在语义上,它使主键为参考更有意义,但由于其分布式系统,我们不能使用AUTO_INCREMENTS这些.对于这些引用(当然JOIN还有它们附带的s ),使用(非空)唯一索引而不是主键是否有缺点?
值得注意的是,主(在线)数据库使用MySQL(InnoDB),分布式(离线)数据库使用SQLite.
编辑:
考虑到将UUID作为主键(因为它在语义上是这样的)可能更好,如果我将UUID设置为主键并将AUTO_INCREMENT列设置为非null唯一索引,我是否会获得顺序插入的好处?或者它只是确定在哪里插入新行时相关的主键?
我已经使用下面的代码打开一个SQLite数据库文件,该文件几乎每天都在网络计算机上运行一年多.突然今天早上,我无法以编程方式打开文件.
private Boolean Connect(String strPathFile)
{
// Initialize the connection object.
this.DbConnection = null;
try
{
// DATABASE: Create the connection string and set the settings.
String strConnection = @"Data Source=" + strPathFile + @";Version=3;";
// DATABASE: Connect to the database.
this.DbConnection = new SQLiteConnection(strConnection);
this.DbConnection.Open();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
该文件是"\ Server\ShareName\FileName.db"形式的网络资源(少于双引号).
这是有趣的事情.SQLite管理员无需重复打开网络数据库文件,没有问题.我也可以在本地打开文件.我将文件复制到本地驱动器,只是更改了Visual Studio 2012(VS2012)中的路径.
服务器似乎很好.自从我最后一次检查它以来,它已经在某个时刻重新启动了.我推测Microsoft Update.文件资源管理器浏览文件夹没有问题,正如我所说,SQLite管理员可以打开网络文件.
我再次检查了权限,每个人都有完全控制权,服务器的用户也可以完全控制安全权限和共享权限.我检查了文件夹和文件,权限是一样的.我同样期待,因为SQLite管理员可以打开该文件.服务器没有设置防火墙,Windows防火墙或其他.我今天早上也重新检查了一下.同样,SQLite管理员会抱怨这一点.
我通过使用文件资源管理器在网络驱动器上制作文件的副本来验证写入.这没有问题.
服务器是Windows Server 2003.我使用的是Windows 7 Professional 64位.
我也试图以只读模式打开数据库,但也失败了.我期待那种行为.SQLite Administrator仍然可以很好地工作.
我尝试了各种其他连接字符串,包括SQLiteConnectionStringBuilder()只是为了看看会发生什么,所有的道路都通向罗马,即:
System.Data.SQLite.SQLiteException occurred
HResult=-2147467259
Message=unable …Run Code Online (Sandbox Code Playgroud) 我做了一个简单的整数更新性能测试.SQLite每秒只进行15次更新,而PostgreSQL每秒进行1500次更新.
SQLite案例的数字似乎是正常的.
SQLite站点中的FAQ解释说它好像是旋转磁盘的基本限制.
实际上,SQLite很容易在普通的台式计算机上每秒执行50,000或更多INSERT语句.但它每秒只会进行几十次交易.交易速度受磁盘驱动器转速的限制.事务通常需要两个完整的磁盘盘旋转,这在7200RPM磁盘驱动器上限制您每秒约60个事务.事务速度受磁盘驱动器速度的限制,因为(默认情况下)SQLite实际上等待,直到事务完成之前数据确实安全地存储在磁盘表面上.这样,如果您突然断电或者操作系统崩溃,您的数据仍然是安全的.有关详细信息,请阅读SQLite中的原子提交.
默认情况下,每个INSERT语句都是自己的事务.但是如果用BEGIN ... COMMIT包围多个INSERT语句,则所有插入都被分组到一个事务中.提交事务所需的时间在所有随附的insert语句中分摊,因此每个insert语句的时间大大减少.
另一种选择是运行PRAGMA synchronous = OFF.此命令将导致SQLite不等待数据到达磁盘表面,这将使写入操作看起来更快.但是,如果在事务中间断电,则数据库文件可能会损坏.
这个描述是真的吗?那么,PostgreSQL如何比SQLite更快地执行?(我在PostgreSQL中设置了两个fsync和synchronous_commit选项on)
更新:
这是用Clojure编写的完整测试代码:
(defproject foo "0.1.0-SNAPSHOT"
:repositories {"sonatype-oss-public" "https://oss.sonatype.org/content/groups/public/"}
:dependencies [[org.clojure/clojure "1.5.1"]
[org.clojure/java.jdbc "0.3.0-SNAPSHOT"]
[com.mchange/c3p0 "0.9.2.1"]
[org.xerial/sqlite-jdbc "3.7.2"]
[postgresql "9.1-901.jdbc4"]])
Run Code Online (Sandbox Code Playgroud)
(ns foo.core
(:require [clojure.java.jdbc :as jdbc]
[clojure.java.jdbc.ddl :as ddl])
(:import [com.mchange.v2.c3p0 ComboPooledDataSource]))
(def sqlite
(let [spec {:classname "org.sqlite.JDBC"
:subprotocol "sqlite"
:subname "test.db"}]
{:datasource (doto (ComboPooledDataSource.)
(.setDriverClass (:classname spec))
(.setJdbcUrl (str "jdbc:" (:subprotocol spec) ":" (:subname spec)))
(.setMaxIdleTimeExcessConnections (* 30 …Run Code Online (Sandbox Code Playgroud) Python的sqlite3 :memory:选项提供比等效的磁盘数据库更快的查询和更新.如何将基于磁盘的数据库加载到内存中,对其执行快速操作,然后将更新后的版本写回磁盘?
问题如何在python中浏览内存sqlite数据库似乎有关,但它侧重于如何在内存数据库中使用基于磁盘的浏览工具.问题如何在Python中将内存中的SQLite数据库复制到另一个内存中的SQLite数据库?也是相关的,但它是Django特有的.
我目前的解决方案是一次一个地读取所有表,从基于磁盘的数据库到元组列表,然后手动重新创建内存数据库的整个数据库模式,然后从中加载数据进入内存数据库的元组列表.在对数据进行操作之后,该过程相反.
肯定有更好的办法!
我在SUSE Linux中有一个SQLite3数据库.
它像命令提示一样停留在命令提示符下:
sqlite> q
...> exit
...> .exit
...> quit
...> .quit
Run Code Online (Sandbox Code Playgroud)
如何退出数据库?