? ? ? ? 上一次寫(xiě)到的圖像加載,這次中間間隔的時(shí)間稍微長(zhǎng)了一些,先對(duì)大家報(bào)個(gè)歉。說(shuō)實(shí)話,差點(diǎn)把這個(gè)事情給忘了。
虧得朋友的提醒,只顧整理忘記發(fā)了,真是罪過(guò)罪過(guò)。今天給大家分享的是在開(kāi)源框架中的有關(guān)數(shù)據(jù)庫(kù)的框架。
? ? ? ? 數(shù)據(jù)庫(kù)這個(gè)東西了解后端的小伙伴都知道,對(duì)程序的來(lái)說(shuō)是相當(dāng)重要。因?yàn)閿?shù)據(jù)是無(wú)價(jià)的,雖然現(xiàn)在有云存儲(chǔ),但是數(shù)
據(jù)庫(kù)這一關(guān)是躲不過(guò)去了。大家經(jīng)常聽(tīng)到的mysql,sqlserver,DB2,Oracle等一些知名的數(shù)據(jù)庫(kù)在各行各業(yè)應(yīng)用非常廣泛。
在我們android系統(tǒng)中自帶的輕量級(jí)的sqlite數(shù)據(jù)庫(kù),作為移動(dòng)端來(lái)說(shuō),足夠使用了。比較其他的確實(shí)用不了,手機(jī)內(nèi)存就那么
大,我們還要存儲(chǔ)我們寶貴的各種資源,確實(shí)裝不下。
? ? ? ? 使用數(shù)據(jù)庫(kù)最痛苦的事情,大概就是寫(xiě)sql語(yǔ)句,還好我們的一般都是簡(jiǎn)單的CRUD,并且涉及的表都是比較簡(jiǎn)單的,要是跟
后臺(tái)一樣,嵌套查詢能寫(xiě)一頁(yè),我估計(jì)android里面涉及的數(shù)據(jù)庫(kù)的部分的需求都要被改了。
現(xiàn)在來(lái)介紹一下,本人了解的一些數(shù)據(jù)庫(kù)框架和一些用法,有什么錯(cuò)誤的或者好的框架請(qǐng)各位朋友留言,不吝賜教一下
4.1數(shù)據(jù)庫(kù)_ormlite
主頁(yè):http://ormlite.com/(這個(gè)貌似需要翻墻)
*配置: 添加以下依賴
?compile 'com.j256.ormlite:ormlite-android:4.48'
compile 'com.j256.ormlite:ormlite-core:4.48'
用途: 操作數(shù)據(jù)庫(kù)
使用步驟
1.創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)的實(shí)體類.示例代碼:
? ?@DatabaseTable(tableName = "user")
? ?public class User {
? ? ? ? ? ? ? ?@DatabaseField(generatedId = true)
? ? ? ? ? ? ? ?private int id;
? ? ? ? ? ? ? ?@DatabaseField(columnName = "name")
? ? ? ? ? ? ? ?private String name;
? ? ? ? ? ? ? ?@DatabaseField(columnName = "age")
? ? ? ? ? ? ? ?private int age;
? ? ? ? ? ? ? ?@DatabaseField(columnName = "tel")
? ? ? ? ? ? ? ?private String tel;
? ? ? ? ? ? ? ? public User() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?public User(String name, int age, String tel) {
? ? ? ? ? ? ? ? ? ? ? ? ? this.name = name;
? ? ? ? ? ? ? ? ? ? ? ? ? this.age = age;
? ? ? ? ? ? ? ? ? ? ? ? ? this.tel = tel;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? }
2.創(chuàng)建OrmLiteSqliteOpenHelper的實(shí)現(xiàn)類.示例代碼:
public class UserDBOpenHelper extends OrmLiteSqliteOpenHelper {
? ? ? ? ? ?public UserDBOpenHelper(Context context) {
? ? ? ? ? ? ? ? ?super(context, "user.db", null, 1);
? ? ? ? ? ? }
? ? ? ? @Override
? ? ? ? public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? // 創(chuàng)建表
? ? ? ? ? ? ? ? ?TableUtils.createTable(connectionSource, User.class);
? ? ? ? ? ? ? ? ?} catch (SQLException e) {
? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? }
? ? ? ?@Override
? ? ? ? public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // 更新表
? ? ? ? ? ? ? ?TableUtils.dropTable(connectionSource, User.class, true);
? ? ? ? ? ? ? ?onCreate(database, connectionSource);
? ? ? ? ? ? ? ?} catch (SQLException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ?}
? ? ? ?}
? ? ? ? ? ?private static UserDBOpenHelper instance;
? ? ? ? ? ?public static synchronized UserDBOpenHelper getInstance(Context context) {
? ? ? ? ? ?if (instance == null) {
? ? ? ? ? ? ? ? ?synchronized (UserDBOpenHelper.class) {
? ? ? ? ? if (instance == null) {
? ? ? ? ? instance = new UserDBOpenHelper(context);
? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?}
? ?}
? ? return instance;
}
? ? ? ?private Dao dao;
? ? ? ?// 獲取操作數(shù)據(jù)庫(kù)的DAO
? ? ? public Dao getUserDao() throws SQLException {
? ? ? if (dao == null) {
? ? ? ? ? ? dao = getDao(User.class);
? ? ? ? ?}
? ? ? ? ? return dao;
? ? ? }
? ? ?@Override
? ? ?public void close() {
? ? ? ? ?super.close();
? ? ? ? ?dao = null;
? ? ? ? ?}
?}
3.獲取數(shù)據(jù)庫(kù)的DAO對(duì)象, 即可進(jìn)行增刪改查的操作.示例代碼:
? ? ? ?UserDBOpenHelper helper = new UserDBOpenHelper(this);
? ? ? ?Dao dao =??helper.getUserDao();
? ? ? ?User user = new User("zhangsan", 12, "13212345678");
? ? ? ?// 增
? ? ? dao.create(user);
? ? ? ?// 改
? ? ? dao.updateRaw("update user set tel = '18882348888' where name = ?", new String[]{"王武"});
? ? ? // 查
? ? ? List query = dao.queryForEq("name", "王武");
? ? ? // 刪
? ? ? dao.deleteById(2);
4.2數(shù)據(jù)庫(kù)_greenDAO(這個(gè)使用頻率比較高)
主頁(yè):https://github.com/greenrobot/greenDAO
配置: 添加以下依賴
官方文檔最新的配置

優(yōu)點(diǎn):
性能最大化,內(nèi)存開(kāi)銷最小化
易于使用的API
為Android進(jìn)行高度優(yōu)化
使用步驟
1.創(chuàng)建自定義的DAOGenerater,指定數(shù)據(jù)庫(kù)相關(guān)配置并生成相關(guān)類
public class CustomDAOGenerater {
? ? ? ? ? public static void main(String[] args) throws Exception {
? ? ? ? ? // 第一個(gè)參數(shù)為數(shù)據(jù)庫(kù)版本
? ? ? ? ? //第二個(gè)參數(shù)為數(shù)據(jù)庫(kù)的包名
? ? ? ? ? Schema schema = new Schema(1, "com.alpha.db");
? ? ? ? ?// 創(chuàng)建表,參數(shù)為表名
? ? ? ? ?Entity entity = schema.addEntity("Info");
? ? ? ? ?// 為表添加字段
? ? ? ? entity.addIdProperty();// 該字段為id
? ? ? ? entity.addStringProperty("name");// String類型字段
? ? ? ? entity.addIntProperty("age");//Int類型字段
? ? ? ?entity.addStringProperty("tel");// String類型字段
? ? ? ? // 生成數(shù)據(jù)庫(kù)相關(guān)類
? ? ? ? //第二個(gè)參數(shù)指定生成文件的本次存儲(chǔ)路徑,AndroidStudio工程指定到當(dāng)前工程的java路徑
? ? ? ? ? ? ?new DaoGenerator().generateAll(schema, "C:\\Users\\Alpha\\AndroidStudioProjects\\GreenDaoDemo\\app\\src\\main\\java");
? ? ? ? ? ? }
? }
2.在Application中通過(guò)DaoMaster.DevOpenHelper初始化數(shù)據(jù)庫(kù)
? ? ? ? ? ? ? // 該初始化過(guò)程最好放在Application中進(jìn)行,避免創(chuàng)建多個(gè)Session
? ? ? ? ? ? ? private void setupDatabase() {
? ? ? ? ? ? ? ? ? ? // 通過(guò) DaoMaster 的內(nèi)部類 DevOpenHelper創(chuàng)建數(shù)據(jù)庫(kù)
? ? ? ? ? ? ? ? ? ?// 注意:默認(rèn)的 DaoMaster.DevOpenHelper 會(huì)在數(shù)據(jù)庫(kù)升級(jí)時(shí),刪除所有的表
? ? ? ? ? ? ? ? ? ?// 所以,在正式的項(xiàng)目中,你還應(yīng)該做一層封裝,來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的安全升級(jí)。
? ? ? ? ? ? ? ? ? ?/**
? ? ? ? ? ? ? ? ? ? ?* @param context : Context
? ? ? ? ? ? ? ? ? ? ?* @param name : 數(shù)據(jù)庫(kù)名字
? ? ? ? ? ? ? ? ? ? ?* @param factory : CursorFactroy
? ? ? ? ? ? ? ? ? ? */
? ? ? ? ? ? ? ? ? DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "student.db", null);
? ? ? ? ? ? ? ? ? // 獲取數(shù)據(jù)庫(kù)
? ? ? ? ? ? ? ? ? SQLiteDatabase database = helper.getWritableDatabase();
? ? ? ? ? ? ? ? ? // 獲取DaoMaster
? ? ? ? ? ? ? ? ?DaoMaster daoMaster = new DaoMaster(database);
? ? ? ? ? ? ? ? ? // 獲取Session
? ? ? ? ? ? ? ? DaoSession daoSession = daoMaster.newSession();
? ? ? ? ? ? ? ? ?// 獲取對(duì)應(yīng)的表的DAO對(duì)象
? ? ? ? ? ? ? ? InfoDao dao = daoSession.getInfoDao();
? ? ? ? ? ?}
3.獲取數(shù)據(jù)庫(kù)的DAO對(duì)象,即可進(jìn)行增刪改查的操作
? ? ? ? ? ? ?// 增
? ? ? ? ? ? dao.insert(new Info(null, "zhangsan", 12, "13112345678"));
? ? ? ? ? ? // 刪
? ? ? ? ? ?dao.deleteByKey(1L);
? ? ? ? ? ?// 改
? ? ? ? ? ?Info info = new Info(3L, "趙琦", 78, "18812348888");
? ? ? ? ? ?dao.update(info);
? ? ? ? ? ?// 查
? ? ? ? ? ?QueryBuilder builder = dao.queryBuilder();
? ? ? ? ? ?builder.where(InfoDao.Properties.Name.eq("lisi"));
? ? ? ? ? Query build = builder.build();
? ? ? ? ? List list = build.list();
?4.3數(shù)據(jù)庫(kù)_Litepal
主頁(yè) :https://github.com/LitePalFramework/LitePal(這個(gè)文檔寫(xiě)的很全)
中文文檔地址: http://blog.csdn.net/sinyu890807/article/category/2522725(感覺(jué)英文別扭的可以看一下分享的博客)
4.4 數(shù)據(jù)庫(kù)_android-lite-orm(國(guó)內(nèi)大神寫(xiě)的,用著挺好用)
主頁(yè):https://github.com/litesuits/android-lite-orm
1.創(chuàng)建數(shù)據(jù)庫(kù)
文檔上解釋:
? ? ? ? 一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)LiteOrm的實(shí)例,如果一個(gè)App只有一個(gè)數(shù)據(jù)庫(kù),那么LiteOrm應(yīng)該是全局單例的。 如果多次新建LiteOrm實(shí)例,系統(tǒng)會(huì)提示你應(yīng)該關(guān)閉之前的數(shù)據(jù)庫(kù),也可能會(huì)引起其他未知錯(cuò)誤。

2.建表邏輯
該框架會(huì)在你新建一個(gè)model的時(shí)候,自動(dòng)的為你創(chuàng)建一個(gè)表,作為使用者的我們,直接操作對(duì)象即可。相當(dāng)于就是建表語(yǔ)句
不過(guò)這樣做,操作更高效

LiteOrm將為開(kāi)發(fā)者建一個(gè)名為“test_model”的數(shù)據(jù)庫(kù)表,其字段為:id name login。 建表語(yǔ)句:CREATE TABLE IF NOT EXISTS test_model (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT, login TEXT DEFAULT true)。
3.數(shù)據(jù)庫(kù)的一些CRUD操作

這個(gè)數(shù)據(jù)庫(kù)框架是國(guó)內(nèi)的大神的寫(xiě)的,簡(jiǎn)單易操作。集成非常簡(jiǎn)單,有興趣的可以參照示例,與之前介紹的框架相比,這個(gè)框架
算是最簡(jiǎn)單的一個(gè),也是文檔介紹比較全面的一個(gè),總的來(lái)說(shuō)簡(jiǎn)單易懂易集成。
? ? ? ? 以上就是關(guān)于android數(shù)據(jù)庫(kù)框架的內(nèi)容,數(shù)據(jù)庫(kù)這個(gè)東西說(shuō)重要吧,確實(shí)重要,但是作為客戶端的我們確實(shí)平常使用頻率
非常之低,而不像后臺(tái)基本上做一個(gè)東西都要跟其深入交流一下,不過(guò)作為知識(shí)的拓展多了解一些,對(duì)我們將來(lái)的發(fā)展還是很有
幫助的。上面的資料大部分都是實(shí)踐過(guò)的,如果有什么不對(duì)的地方,請(qǐng)各位朋友及時(shí)的指出來(lái),不吝賜教。