Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析 Carson带你学Android:SQLlite数据库操作全解析(SQLiteOpenHelper类)_Carson带你学Android-优快云博客_安卓sqliteopenhelper
上文是SQLite的常用用法.下文是相关应用补充.
一 事务
1 定义:一组命令同时执行要么成功,要么失败所有命令重做.保证了操作原子
特点:事务(ACID):原子性、一致性、隔离性和持久性
下面这篇blog写的很详细,用T为时间主线的表理解起来很高效。最后那个database分级表也很好。
https://blog.youkuaiyun.com/lovesomnus/article/details/44459675
2 使用
m_dirDatabase->transactionBegin();
DirEnt modDirEnt = dirEnt; // a DirEnt we can modify
rc = do_addFavorite(modDirEnt, favoriteId);
if (rc == kNoError)
{
m_dirDatabase->transactionCommit();
}
else
{
m_dirDatabase->transactionRollback();
}
二 数据库锁定(Database Locking)
SQlite允许多个数据库连接并行读取同一个数据库文件即Database并发,不过任何写操作都需要完整的,整个数据库文件的独占访问.
写database需要lock,大部分写操作仅仅需要几分之一秒.
死锁(Deadlocks):比如两个数据库连接各自持有一些锁,但是它们现在都在等待对方持有的锁被释放,这样就会造成死锁现象。唯一的解决办法,就是其中一个数据库连接放弃获取锁的操作,并释放自己所持有的锁。
三 SQLite 实现
database 是3层实现
SqliteStatement.cpp 就是sqlite3 database的具体实现
DirAddFavoriteEnt (FavoriteEnt.cpp(new add))
---pDirSrvrPrivate->addFavorite() (DirServer.cpp(native/../db/ 应用层,给外部提供接口) )
---m_dirDatabase->readNumberOfContactsInFavoritesAndLocal(DirDataBase.cpp(数据库: 所有table的集合,eg:m_favoriteEnt,m_dirEnt等))
---DirEntTable m_localEntries.readNumberOfContacts ()
---SqliteStatement m_readNumberOfContacts.getResults() (DirEntTable.cpp table的所有数据库操作,返回result)
四 SQLite加密
sqlitecipher
其他:主键和外键
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。