GreenDao使用踩過的坑
本來想用litePal,看了郭大嬸的說明,真的是好用!
後來發現網上說比較流行的還是 GREENDAO,且效率不錯!
不用管那麽多了,直接用吧.
----------------------------------------------------------------------------------
看了一天的 GREENDAO,還是沒有敢動手,那就動起來!
----------------------------------------------------------------------------------
1.先導入包,直接按官網來
-------------------------
// In your root build.gradle file: 項目的 build.gradle buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath ‘com.android.tools.build:gradle:2.3.0‘ classpath ‘org.greenrobot:greendao-gradle-plugin:3.2.2‘ // add plugin} } // In your app projects build.gradle file: 應用程序的 build.gradle apply plugin: ‘com.android.application‘ apply plugin: ‘org.greenrobot.greendao‘ // apply plugin dependencies { compile ‘org.greenrobot:greendao:3.2.2‘ // add library }
導入結束,高高興興的準備在application 中加入 daoMaster daoSession
private DaoMaster.DevOpenHelper mHelper; private SQLiteDatabase db; private DaoMaster mDaoMaster; private DaoSession mDaoSession;
這裏還有個小插曲:不要笑我笨!
我根本找不到 application 類在哪???
後來,一個大兄弟告訴我,那需要你自己寫個 應用類,,繼承application ,大概長這樣:
import android.app.Application; /** * Created by Think on 2017/12/21. */ public class BaseApp extends Application { @Override public void onCreate() { super.onCreate(); } }
建立完app後還要在 AndroidManifest.xml 中加入 name=‘BaseApp‘
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ssqhan.mydbtest">
<application
android:name="BaseApp"
.............................
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
好吧,快寫上內容:(官網是這樣要求的)
// do this once, for example in your Application class 這不,,要求寫到應用程序中 helper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); // do this in your activities/fragments to get hold of a DAO noteDao = daoSession.getNoteDao();
//那我們就這樣寫了
//----------------------------------------------
import android.app.Application; /** * Created by Think on 2017/12/21. */ public class BaseApp extends Application { private DaoMaster.DevOpenHelper mHelper; private SQLiteDatabase db; private DaoMaster mDaoMaster; private DaoSession mDaoSession; // do this once, for example in your Application class mHelper= new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); mDaoMaster= new DaoMaster(db); mDaoSession=mDaoMaster.newSession(); // do this in your activities/fragments to get hold of a DAO noteDao = daoSession.getNoteDao(); @Override public void onCreate() { super.onCreate(); } }
可是會發現, DAOMaster 是紅色的 且出現: cannot resolve symbol ‘daoMaster‘
why???????????
----------------------------------------------------------------------------------------------------
2.正確姿勢就該這樣:
(1)先建一個實體這樣:(直接COPY 官網上的)
@Entity public class User { @Id private Long id; private String name; @Transient private int tempUsageCount; // not persisted // getters and setters for id and user ... }
什麽,又是一片紅: 一通 ‘alt+enter‘ 解決問題
(2) 這樣就自動生成三個文件
我當時現現了另一個神級的錯誤: 三個文件最上面出現 package; 並且標紅
解決方法:直接刪除 package
(後來發現,刪除是不對的,沒有能正確的生成包名是因為 User 實體的位置放置不對,所以生成的 DaoMaster,DaoSession,UserDao 的包名都不正確)
又發現:userDao裏的 User又標紅 ‘alt+enter‘ 直接 import User就可以了!
現在才剛剛開始!
-------------------------------------------------------------------------------------------------------
3.寫入全局應用程序中
終於不再看到 標紅的 字樣了..真的有點崩潰了!
再來看看:
public class BaseApp extends Application { private DaoMaster.DevOpenHelper mHelper; private SQLiteDatabase db; private DaoMaster mDaoMaster; private DaoSession mDaoSession; @Override public void onCreate() { super.onCreate(); mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = mHelper.getWritableDatabase(); mDaoMaster = new DaoMaster(db); mDaoSession = mDaoMaster.newSession(); // do this in your activities/fragments to get hold of a DAO 既然要在 activities 裏,那這裏就不用了 //noteDao = mDaoSession.getNoteDao(); } }
好了.沒有標紅,我的個小心臟啊..真的有點受不了了!
好吧,還是讓代碼看來起更優雅一點(借用大俠的代碼,地址:http://www.jianshu.com/p/4986100eff90):
public class BaseApp extends Application { private DaoMaster.DevOpenHelper mHelper; private SQLiteDatabase db; private DaoMaster mDaoMaster; private DaoSession mDaoSession; public static BaseApp instances; @Override public void onCreate() { super.onCreate(); instances = this; setDatabase(); } public static BaseApp getInstances(){ return instances; } /** * 設置greenDao */ private void setDatabase() { // 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。 // 可能你已經註意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。 // 註意:默認的 DaoMaster.DevOpenHelper 會在數據庫升級時,刪除所有的表,意味著這將導致數據的丟失。 // 所以,在正式的項目中,你還應該做一層封裝,來實現數據庫的安全升級。 mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = mHelper.getWritableDatabase(); // 註意:該數據庫連接屬於 DaoMaster,所以多個 Session 指的是相同的數據庫連接。 mDaoMaster = new DaoMaster(db); mDaoSession = mDaoMaster.newSession(); } public DaoSession getDaoSession() { return mDaoSession; } public SQLiteDatabase getDb() { return db; } }
上面說了,那句話要在 activity 裏,那就打開主activity.
-------------------------------------------------------------------------------------
4. 主activity中加入實體操作
該怎麽寫呢? 以下這樣,出錯了,看標紅:
那又該如何做???? 腦袋中直冒金星!!!
*****************************************************************************
經過多方測試,發現我的User 實體放的位置不對!應該放到 JAVA下面的 COM.example.***下面,再 build project這樣就不會有問題了。
正確的姿勢應該這樣:
package com.example.ssqhan.mydbtest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import org.greenrobot.greendao.query.QueryBuilder; import java.util.List; public class MainActivity extends AppCompatActivity { MenuDao mMenuDao; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); creatTable(); tv=findViewById(R.id.tv); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { QueryBuilder<Menu> queryMenu = mUserDao.queryBuilder(); queryMenu.where(MenuDao.Properties.Id.eq(1)); List<Menu> list = queryMenu.list(); tv.setText((list.get(0)).getName()); } }); } public void creatTable(){ mMenuDao = BaseApp.getInstances().getDaoSession().getMenuDao(); Menu menu = new Menu((long)1,"MenuItem"); mMenuDao.insert(menu); } }
上面的代碼,,點擊運行,答案出來了。。。tv的text 變成了 MenuItem(我把User實體換成了Menu) 別的都一樣!
GreenDao使用踩過的坑