GreenDao
Android開發數據庫的第三方框架,據說效率高,不過比原生升級方便多了。寫給自己以後方便查看,共享給大家一起學習使用。
1、工程build.gradle下
buildscript {
repositories {
maven { url 'https://maven.google.com' }
jcenter()
google()
mavenCentral()//***GreenDao需要增加
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'//***GreenDao需要增加
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2、moudle裏的build.gradle
android {
..............
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
greendao {
schemaVersion 1 //版本號
daoPackage 'com.study.test.testapplication.db' //包名+dbName
targetGenDir 'src/main/java' //db路徑
}
}
dependencies {
......
implementation 'org.greenrobot:greendao:3.2.2'
}
3、項目同步下,重新BUILD一遍
4、MyApplication 初始化
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static MyApplication instances;
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
/**
* 單例模式
*
* @return
*/
public static MyApplication getInstances() {
return instances;
}
/**
* 設置greenDao
*/
private void setDatabase() {
// 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。
// 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因爲 greenDAO 已經幫你做了。
// 注意:默認的 DaoMaster.DevOpenHelper 會在數據庫升級時,刪除所有的表,意味着這將導致數據的丟失。
// 所以,在正式的項目中,你還應該做一層封裝,來實現數據庫的安全升級。
mHelper = new DaoMaster.DevOpenHelper(this, "test-db", null);
db = mHelper.getWritableDatabase();
// 注意:該數據庫連接屬於 DaoMaster,所以多個 Session 指的是相同的數據庫連接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
5、創建一個User表實體類:
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
private String sex;
private String age;
private String email;
.....中間的代碼build會自己生成...
}
6、創建SQLUtils
public class SQLiteUtils {
private static SQLiteUtils instance;
private UserDao userEntityDao;
private DaoSession daoSession;
private DaoMaster.DevOpenHelper helper;
private SQLiteUtils() {
daoSession = MyApplication.getInstances().getDaoSession();
userEntityDao = daoSession.getUserDao();
QueryBuilder.LOG_VALUES=true;
QueryBuilder.LOG_SQL=true;
}
public static SQLiteUtils getInstance() {
if (instance == null) {
synchronized (SQLiteUtils.class) {
if (instance == null) {
instance = new SQLiteUtils();
}
}
}
return instance;
}
//增加
public void addUser(User testBean) {
userEntityDao.insert(testBean);
}
//刪除
public void deleteUser(User testBean) {
userEntityDao.delete(testBean);
}
//修改
public void updateUser(User testBean) {
userEntityDao.update(testBean);
}
/**
* 根據年齡,修改數據
* @param age
* @param user
*/
public void updateWhereAgeUser(String age,User user){
daoSession.getDatabase().execSQL("update user set age=? where age=?and email=?",new Object[]{age,user.getAge(),user.getEmail()});
}
//查詢所有
public List<User> selectAllUser() {
userEntityDao.detachAll();//清除緩存
List<User> list1 = userEntityDao.loadAll();
return list1 == null ? new ArrayList<User>() : list1;
}
//條件查詢
public List<User> selectWhereAge(String age) {
QueryBuilder<User> queryBuilder = userEntityDao.queryBuilder().where(UserDao.Properties.Age.eq(age));
return queryBuilder.list();
}
//刪除表中內容
public void deleteAllUser() {
userEntityDao.deleteAll();
}
/**
* 條件刪除表中數據
* @param age [條件]
*/
public void deletewhereAge(String age) {
daoSession.getDatabase().execSQL("delete from user where age=?",new Object[]{age});
}
/**
* 關閉所有的操作
* 注:數據庫開啓之後,使用完畢必須要關閉
*/
public void closeConnection() {
closeHelper();
closeDaoSession();
}
private void closeHelper() {
if (helper != null) {
helper.close();
helper = null;
}
}
private void closeDaoSession() {
if (daoSession != null) {
daoSession.clear();
daoSession = null;
}
}
}
7、使用SQLUtils操作GreenDao
- 插入數據
SQLiteUtils.getInstance().addUser(new User(null, "name", "sex", "10", "email"));
- 查詢數據
//所有數據查詢
SQLiteUtils.getInstance().selectAllUser();
//條件查詢
SQLiteUtils.getInstance().selectWhereAge(“10”);
- 修改數據
SQLiteUtils.getInstance().updateWhereAgeUser("10",new User(null, "name1221", "sex", "22", "email"));
- 刪除數據
//這種默認,通過id條件
SQLiteUtils.getInstance().deletewhereAge(new User());
//條件修改
SQLiteUtils.getInstance().deletewhereAge("1000");
GreenDao封裝 解決 升級數據庫丟失原數據
1、使用的是Github上的框架
【1】添加依賴,根據GreenDao的版本選擇依賴版本
1、封裝MyOpenHelper
public class MyOpenHelper extends DaoMaster.DevOpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
// super.onUpgrade(db, oldVersion, newVersion); //記得註釋哦!!!
if (oldVersion < newVersion) {
Log.i("version", oldVersion + "---先前和更新之後的版本---" + newVersion);
}
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
Log.e("chenxh","ifNotExists:"+ifNotExists);
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
Log.e("chenxh","ifExists:"+ifExists);
DaoMaster.dropAllTables(db, true);
}
},UserDao.class);//需要添加表,加全,不要漏
}
}
3、在Myapplication中創建數據庫:
public class MyApplication extends Application {
private MyOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static MyApplication instances;
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
/**
* 單例模式
*
* @return
*/
public static MyApplication getInstances() {
return instances;
}
/**
* 設置greenDao
*/
private void setDatabase() {
//第三方升級庫
MigrationHelper.DEBUG = true;
//封裝的Daomaster 主要封裝了升級保存數據的方法
mHelper = new MyOpenHelper(this, "test-db", null);
db = mHelper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
有疑問可以發郵件[email protected]