我决定使用SQLite,因为它允许将数据库存储到单个文件中.我想我已经设法用SQLite数据库浏览器做了一个数据库.
如何在C/C++程序中读取该数据?
关于在Android中处理SQLite数据库连接,我有一个(希望)快速的问题.我有一个自然地由几个活动组成的应用程序.我创建/更新/查询数据库没有问题,因为我已经创建了一个专用的类来通过SQLiteOpenHelper等来处理这项工作.
我的问题是:由于这些活动都共享同一个数据库,这通常是作为单个静态成员实现的,还是每个活动都拥有自己的连接?我当然关心的是每次活动中重新连接数据库的成本.
或者换句话说,有没有理由不存储单例实例?
我也想知道幕后是否有类似于.NET连接池的事情,以降低打开连接的成本.
提前致谢!
我刚刚意识到我的一个数据库insert()命令由于违反了非空约束而失败 - 我只是在这个字段中没有填充任何数据.
问题是,我花了很长时间才发现为什么这个插入返回-1,因为我无法在任何地方找到错误或异常.
我希望,我想对于更复杂的数据库和查询,最重要的是,从数据库中获取某些信息真正发生的事情会导致数据库访问失败,但我无法在任何地方找到任何相关信息.
有2,100个参数的限制可以传递给Sql Server查询,即通过ADO.Net,但.Net开发人员使用的其他常用数据库的记录限制是什么 - 特别是我对以下内容感兴趣:
有人知道吗?
我将一些数据直接存储在我的iOS应用程序中的本地.sqlite文件中.我选择这样做而不是CoreData,因为数据需要与非Apple平台兼容.
现在,我正在尝试通过iCloud提供同步此文件的最佳方法.我知道你不能直接同步它,原因有很多.我知道CoreData是能够同步的数据块,但即使忽略使用CD将基本上锁定这个文件放到苹果平台(我认为吗?我只看着CD了一下),我需要这个文件的iCloud同步跨工作所有iCloud支持的平台 - 应该包括Windows.我必须假设Windows API中的CoreData文件没有任何兼容性.如果Apple告诉我们的不仅仅是"将会有一个Windows API [最终?]",那么规划出实现这一目标的最佳方法会容易得多.
此外,我最终还需要实现至少一个同步服务来支持iCloud不支持的平台.如果我用于iCloud的方法可以主要用于未来的服务,那将是有帮助的,尽管不是必需的.
出于这些原因,我认为CoreData不能帮助我解决这个问题.我在想这个是正确的吗?
从那里继续,我需要为此设计一个算法,或找到现有的或第三方现有的解决方案.我还没有发现任何事情.但是,我一直在考虑我可以实现的几种可能的方法:
方法1:
执行类似于CoreData同步sqlite DB的操作:将"事务日志"发送到iCloud,然后构建每个本地sqlite文件.
我想每个设备都会发送一个(唯一命名的)文本文件,列出该设备执行的所有sql命令,并带有时间戳.设备将存储它已执行的每个命令列表中的距离,并在每次更新文件时从该点继续.如果它一次收到多个日志文件的更新,它将按时间戳顺序执行每个命令.
一旦这些文件变大,事情就会变得有趣"有趣",但这似乎是一个可解决的问题.
方法2:
定期将工作数据库的副本同步到iCloud.在每条记录中都有一个修改时间戳字段.当更新的数据库副本通过时,查询具有比某个参考时间更新的时间戳的所有记录,并从新数据更新本地数据库中的记录.
我发现这种方法有很多潜在的问题:
- 有进一步实现的东西来识别记录删除.
- DB文件可能会发生冲突.可以通过按时间戳顺序处理每个冲突版本来处理它们.
- 确定检查每个更新的日期可能很棘手,因为它取决于更新来自哪个设备.
方法2存在很多潜在的问题,但方法1 对我来说似乎是可行的......
有没有人对什么是最好的行动方案有任何建议?有没有比我的"方法1"更好的想法(或者为什么它不起作用的原因)?
Afaik,SQLite将单个数据库存储在一个文件中.由于这会降低使用大型数据库时的性能,是否可以明确告诉SQLite不要将整个数据库存储在单个文件中,而是将不同的表存储在不同的文件中?
我一直在阅读,浏览,搜索很多,我来回交叉堆栈溢出很多次,我设法尽可能地缩小我的问题.
我唯一不明白的是如何充分利用内存中的SQLite数据库.
这是我的情况 - 我有一个加密的SQLite数据库,我在加载我的应用程序时解密(这部分可以肯定).我与数据库交互的类肯定使用普通数据库.因此,为了简化,一切都是完美无缺的,从内部手机内存加载的普通数据库,但我不知道如何或在何处将解密的数据库存储在内存中,因此它将被解释为普通数据库.
我想我应该把null,而不是一个名称的super(context, null, null, 3);,用:memory:的,而不是一个路径SQLiteDatabase.openDatabase(),但我还是不完全了解.它说它找不到android_metadata表,但我确信数据库是应该的.
希望我对此很清楚:)
有很多答案和教程使用InsertHelper在SQLiteDatabase中快速批量插入.
但是从API 17开始,不推荐使用InsertHelper.
什么是在Android SQLite中批量插入大量数据的最快方法?
到目前为止,我最关心的是SQLiteStatement使用起来不太舒服,其中InsertHelper具有绑定列和绑定值,这有点微不足道.
sqlite android bulkinsert android-contentprovider android-sqlite
在WWDC 2013会议'207:Core Data中的新功能'中,他们提到您可以通过在添加持久存储时传递选项字典来启用SQLite WAL:
@{ NSSQLitePragmasOption: @"journal_mode = WAL" }
Run Code Online (Sandbox Code Playgroud)
(可在iOS4 +上使用,将成为未来iOS版本的默认设置).
我想知道在我的应用程序中为早期的iOS版本启用这通常是一件好事.
我已经查阅了关于提前写入日志的SQLite页面以及它们提到的缺点,其中大多数似乎不适用于iOS,除了:
几乎所有优点听起来都像是iOS上的好处:
我很想(可能需要对我的应用程序进行一些检查,以确保它不会减慢速度),这将是一件好事,但是我应该注意哪些缺点或任何已知问题?
我读到了这一点:使用Python将CSV文件导入sqlite3数据库表
并且似乎每个人都建议使用逐行阅读而不是使用SQLite的批量.import.但是,如果您有数百万行数据,这将使插入真的很慢.有没有其他方法来规避这个?
更新:我尝试了以下代码逐行插入,但速度不如我预期的那么好.无论如何都要改进它
for logFileName in allLogFilesName:
logFile = codecs.open(logFileName, 'rb', encoding='utf-8')
for logLine in logFile:
logLineAsList = logLine.split('\t')
output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList)
logFile.close()
connection.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud) sqlite ×10
android ×4
core-data ×2
database ×2
ios ×2
architecture ×1
bulkinsert ×1
c ×1
c++ ×1
exception ×1
icloud ×1
in-memory ×1
mysql ×1
oracle ×1
postgresql ×1
python ×1
sql-server ×1