<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>爱周末 &#187; sqlite</title>
	<atom:link href="http://zhoumo123.cn/tag/sqlite/feed" rel="self" type="application/rss+xml" />
	<link>http://zhoumo123.cn</link>
	<description>知识分享，共同进步。zhoumo123.cn</description>
	<lastBuildDate>Thu, 07 Nov 2019 05:53:49 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>sqlite创建自增字段sqlite3自增key设定</title>
		<link>http://zhoumo123.cn/sqlite/2920.html</link>
		<comments>http://zhoumo123.cn/sqlite/2920.html#comments</comments>
		<pubDate>Tue, 16 Jun 2015 13:41:51 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=2920</guid>
		<description><![CDATA[在用sqlite设计表时，每个表都有一个自己的整形id值作为主键，其实可以不指定这么一个id值，sqlite内部本来就会为每个表加上一个　rowid，这个rowid可以当成一个隐含的字段使用，但是由sqlite引擎来维护的，在3.0以前rowid是32位的整数，3.0以后是 64位的整数，为什么不直接使用这个内部的rowid作为每个表的id主键呢。 相关的文档在这里：?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.html 用指定INTEGER PRIMARY KEY AUTOINCREMENT 和不指定自增长字段用r ...  <a href="http://zhoumo123.cn/sqlite/2920.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>在用sqlite设计表时，每个表都有一个自己的整形id值作为主键，其实可以不指定这么一个id值，sqlite内部本来就会为每个表加上一个　rowid，这个rowid可以当成一个隐含的字段使用，但是由sqlite引擎来维护的，在3.0以前rowid是32位的整数，3.0以后是 64位的整数，为什么不直接使用这个内部的rowid作为每个表的id主键呢。</p>
<p>相关的文档在这里：?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.html</p>
<p>用指定INTEGER PRIMARY KEY AUTOINCREMENT 和不指定自增长字段用rowid有什么区别:</p>
<p>使用自增长字段为主键有不少问题，比如维护或是在大型分布应用中主键冲突的解决等。在一些大型分布应用中主键一般选用guid，这可以有效的避免主键冲突，减少对主键维护的工程。当然，对于中小型的应用，自增长字段的好处更多一些，简单、快速。</p>
<p>Sqlite中，一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT，那么在插入一个新数据时，只需要将这个字段的值指定为NULL，即可由引擎自动设定其值，引擎会设定为最大的rowid+1。当然，也可以设置为非NULL的数字来自己指定这个值，但这样就必须自己小心，不要引起冲突。当这个rowid的值大于所能表达的最大值 9223372036854775807 （3.0及以后版本的rowid最大值）后，rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前，rowid的值是严格单调增加的。<br />
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。<br />
第一，在达到最大值后，rowid会找已被删除的字段对应的rowid作为新值，而自增长字段则会丢出一个SQLITE_FULL的错误。<br />
第二，自增长字段在增加新值时，是找一个从没被使用过的rowid作为新值，而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大，尤其是一些对id值有依赖的元记录，只适合使用自增长字段而不能用rowid。</p>
<p>比如，我们设计一个元记录表：<br />
drop table test;<br />
create table test (<br />
[tkid] integer PRIMARY KEY autoincrement, &#8212; 设置主键<br />
[tktype] int default 0,<br />
[tableid] varchar (50),<br />
[createdate] datetime default (datetime(&#8216;now&#8217;, &#8216;localtime&#8217;)) &#8212; 时间<br />
);<br />
第三，使用自增长字段，引擎会自动产生一个sqlite_sequence表，用于记录每个表的自增长字段的已使用的最大值，用户可以看到，并可以用使用 Update、Delete和Insert操作，但不建议这么使用，这会让引擎混乱。如果使用rowid，也会有这么一个内部表，用户可以维护rowid 值，但看不到。<br />
这么看来，如果直接使用rowid来代替自增加字段，根据两者的细微的差别，需要注意是否与自己的应用冲突，如果没有冲突，那么用rowid会更快一点。</p>
<p>SQLite中创建自增字段:</p>
<p>简单的回答：一个声明为 INTEGER PRIMARY KEY 的字段将自动增加。</p>
<p>从 SQLite 的 2.3.4 版本开始，如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY，那么无论你何时向该表的该字段插入一个 NULL 值，这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数；如果表为空，那么将被更换为 1。</p>
<p>一个新的API函数 sqlite3_last_insert_rowid() 返回最近的插入操作的整形键.</p>
<p>注意这个整型键始终比之前插入表中的最后一个键大1。新键相对于表中的已有键来说是唯一的，但它可能与之前从表中删除的键值重叠。要始终得到在整个表中唯一的键，在INTEGER PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将总是比表中已存在的最大键大1。若可能的最大键已存在于表中，INSERT操作将失败并返回一个SQLITE_FULL错误码.</p>
<p>原文：</p>
<p>http://www.cnblogs.com/zhw511006/archive/2010/09/08/1821596.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/sqlite/2920.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sqlite 打开数据库</title>
		<link>http://zhoumo123.cn/sqlite/622.html</link>
		<comments>http://zhoumo123.cn/sqlite/622.html#comments</comments>
		<pubDate>Fri, 19 Sep 2014 22:54:38 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=622</guid>
		<description><![CDATA[+ (sqlite3 * )openDB; { if (db == nil) { 获取document文件的路径 参数1: 文件夹名字 参数2 . 查找域 参数3. 是否使用绝对路径 NSString * docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject ; 数据库文件的路径 NSString * dbPath = [docPath stringByAppendingPathComponent:FILE_NAME]; iOS 中管理文件的类  ...  <a href="http://zhoumo123.cn/sqlite/622.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>+ (sqlite3 * )openDB;<br />
{</p>
<p>if (db == nil) {<br />
获取document文件的路径<br />
参数1: 文件夹名字 参数2 . 查找域 参数3. 是否使用绝对路径<br />
NSString * docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject ;<br />
数据库文件的路径<br />
NSString * dbPath = [docPath stringByAppendingPathComponent:FILE_NAME];</p>
<p>iOS 中管理文件的类<br />
NSFileManager 负责赋值文件, 删除文件 , 移动文件</p>
<p>NSFileManager * fm = [NSFileManager defaultManager];</p>
<p>判断document中是否有sqlite文件 , 没有则从app中复制文件到 document<br />
if (![fm fileExistsAtPath:dbPath]) {<br />
获取.APP 中 sqlite文件路径<br />
NSString * bundlePath = [[NSBundle mainBundle] pathForResource:@&#8221;DataBase&#8221; ofType:@&#8221;sqlite&#8221;];<br />
NSError * error = nil;<br />
复制<br />
BOOL result = [fm copyItemAtPath:bundlePath toPath:dbPath error:&amp;error];<br />
if (!result) {<br />
NSLog(@&#8221;%@&#8221;,error);<br />
}<br />
}</p>
<p>打开数据库 . 参数1 文件路径 参数2 , 接收数据库的指针<br />
sqlite3_open([dbPath UTF8String], &amp;db);</p>
<p>}</p>
<p>return db;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/sqlite/622.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
