GreenDAO 3.0 数据库集成,使用,升级
来源:互联网 发布:LINUX权威指南怎么样 编辑:程序博客网 时间:2024/06/10 09:23
import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.support.annotation.NonNull;import android.text.TextUtils;import android.util.Log;import org.greenrobot.greendao.AbstractDao;import org.greenrobot.greendao.database.Database;import org.greenrobot.greendao.database.StandardDatabase;import org.greenrobot.greendao.internal.DaoConfig;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * Created by cuiyk on 17-2-28. */public class MigrationHelper { public static boolean DEBUG = false; private static String TAG = "MigrationHelper"; private static final String SQLITE_MASTER = "sqlite_master"; private static final String SQLITE_TEMP_MASTER = "sqlite_temp_master"; public static void migrate(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) { Database database = new StandardDatabase(db); printLog("【The Old Database Version】" + db.getVersion()); printLog("【Generate temp table】start"); generateTempTables(database, daoClasses); printLog("【Generate temp table】complete"); dropAllTables(database, true, daoClasses); createAllTables(database, false, daoClasses); printLog("【Restore data】start"); restoreData(database, daoClasses); printLog("【Restore data】complete"); } private static void generateTempTables(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) { for (int i = 0; i < daoClasses.length; i++) { String tempTableName = null; DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); String tableName = daoConfig.tablename; if (!isTableExists(db, false, tableName)) { printLog("【New Table】" + tableName); continue; } try { tempTableName = daoConfig.tablename.concat("_TEMP"); StringBuilder dropTableStringBuilder = new StringBuilder(); dropTableStringBuilder.append("DROP TABLE IF EXISTS ").append(tempTableName).append(";"); db.execSQL(dropTableStringBuilder.toString()); StringBuilder insertTableStringBuilder = new StringBuilder(); insertTableStringBuilder.append("CREATE TEMPORARY TABLE ").append(tempTableName); insertTableStringBuilder.append(" AS SELECT * FROM ").append(tableName).append(";"); db.execSQL(insertTableStringBuilder.toString()); printLog("【Table】" + tableName +"\n ---Columns-->"+getColumnsStr(daoConfig)); printLog("【Generate temp table】" + tempTableName); } catch (SQLException e) { Log.e(TAG, "【Failed to generate temp table】" + tempTableName, e); } } } private static boolean isTableExists(Database db, boolean isTemp, String tableName) { if (db == null || TextUtils.isEmpty(tableName)) { return false; } String dbName = isTemp ? SQLITE_TEMP_MASTER : SQLITE_MASTER; String sql = "SELECT COUNT(*) FROM " + dbName + " WHERE type = ? AND name = ?"; Cursor cursor=null; int count = 0; try { cursor = db.rawQuery(sql, new String[]{"table", tableName}); if (cursor == null || !cursor.moveToFirst()) { return false; } count = cursor.getInt(0); } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) cursor.close(); } return count > 0; } private static String getColumnsStr(DaoConfig daoConfig) { if (daoConfig == null) { return "no columns"; } StringBuilder builder = new StringBuilder(); for (int i = 0; i < daoConfig.allColumns.length; i++) { builder.append(daoConfig.allColumns[i]); builder.append(","); } if (builder.length() > 0) { builder.deleteCharAt(builder.length() - 1); } return builder.toString(); } private static void dropAllTables(Database db, boolean ifExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { reflectMethod(db, "dropTable", ifExists, daoClasses); printLog("【Drop all table】"); } private static void createAllTables(Database db, boolean ifNotExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { reflectMethod(db, "createTable", ifNotExists, daoClasses); printLog("【Create all table】"); } /** * dao class already define the sql exec method, so just invoke it */ private static void reflectMethod(Database db, String methodName, boolean isExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { if (daoClasses.length < 1) { return; } try { for (Class cls : daoClasses) { Method method = cls.getDeclaredMethod(methodName, Database.class, boolean.class); method.invoke(null, db, isExists); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } private static void restoreData(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) { for (int i = 0; i < daoClasses.length; i++) { DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); String tableName = daoConfig.tablename; String tempTableName = daoConfig.tablename.concat("_TEMP"); if (!isTableExists(db, true, tempTableName)) { continue; } try { // get all columns from tempTable, take careful to use the columns list List<String> columns = getColumns(db, tempTableName); ArrayList<String> properties = new ArrayList<>(columns.size()); for (int j = 0; j < daoConfig.properties.length; j++) { String columnName = daoConfig.properties[j].columnName; if (columns.contains(columnName)) { properties.add(columnName); } } if (properties.size() > 0) { final String columnSQL = TextUtils.join(",", properties); StringBuilder insertTableStringBuilder = new StringBuilder(); insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" ("); insertTableStringBuilder.append(columnSQL); insertTableStringBuilder.append(") SELECT "); insertTableStringBuilder.append(columnSQL); insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";"); db.execSQL(insertTableStringBuilder.toString()); printLog("【Restore data】 to " + tableName); } StringBuilder dropTableStringBuilder = new StringBuilder(); dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); db.execSQL(dropTableStringBuilder.toString()); printLog("【Drop temp table】" + tempTableName); } catch (SQLException e) { Log.e(TAG, "【Failed to restore data from temp table 】" + tempTableName, e); } } } private static List<String> getColumns(Database db, String tableName) { List<String> columns = null; Cursor cursor = null; try { cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 0", null); if (null != cursor && cursor.getColumnCount() > 0) { columns = Arrays.asList(cursor.getColumnNames()); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) cursor.close(); if (null == columns) columns = new ArrayList<>(); } return columns; } private static void printLog(String info){ if(DEBUG){ Log.d(TAG, info); } }}
本篇文章基于Android studo开发工具编写
1、集成
参考官方文档 https://github.com/greenrobot/greenDAO
在项目的application目录的build.gradle文件里加上如下代码
buildscript { repositories { mavenCentral() } dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' }}apply plugin: 'org.greenrobot.greendao'greendao { schemaVersion 2 //这是修改数据库版本号,一定要注意位置,在apply plugin: 'org.greenrobot.greendao'下面}dependencies { compile 'org.greenrobot:greendao:3.2.0'}添加完成重新build一下就成功集成了greendao了
2、简单的使用
创建数据表,每个Entity类就是一个表,如下:
package com.stu.myapplication;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;import org.greenrobot.greendao.annotation.Generated;/** * Created by cuiyk on 17-2-28. */@Entitypublic class User { @Id private Long id; private String name; private int age; private String tiem; //下面是build后自动添加的,开发者可以不要自己添加 @Generated(hash = 1634397952) public User(Long id, String name, int age, String tiem) { this.id = id; this.name = name; this.age = age; this.tiem = tiem; } @Generated(hash = 586692638) public User() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public String getTiem() { return this.tiem; } public void setTiem(String tiem) { this.tiem = tiem; }}
MigrationHelper类是数据库升级的辅助类
来源于 https://github.com/yuweiguocn/GreenDaoUpgradeHelper 我是直接搬过来的
自定义一个OpenHelper类,为以后数据库时使用
public class MyOpenHelper extends DaoMaster.OpenHelper { public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { MigrationHelper.migrate(db,UserDao.class);//数据版本变更才会执行 }}
创建数据库操作类
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;/** * Created by cuiyk on 17-2-28. */public class DBManager { private final static String dbName = "test_db"; private static DBManager mInstance; private MyOpenHelper openHelper; private Context context; public DBManager(Context context) { this.context = context; openHelper = new MyOpenHelper(context, dbName, null); } /** * 获取单例引用 * * @param context * @return */ public static DBManager getInstance(Context context) { if (mInstance == null) { synchronized (DBManager.class) { if (mInstance == null) { mInstance = new DBManager(context); } } } return mInstance; } /** * 获取可读数据库 */ private SQLiteDatabase getReadableDatabase() { if (openHelper == null) { openHelper = new MyOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getReadableDatabase(); return db; } /** * 获取可写数据库 */ private SQLiteDatabase getWritableDatabase() { if (openHelper == null) { openHelper = new MyOpenHelper(context, dbName, null); } SQLiteDatabase db = openHelper.getWritableDatabase(); return db; } /** * 插入一条记录 * * @param user */ public void insertUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.insert(user); } /** * 插入用户集合 * * @param users */ public void insertUserList(List<User> users) { if (users == null || users.isEmpty()) { return; } DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.insertInTx(users); } /** * 删除一条记录 * * @param user */ public void deleteUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.delete(user); } /** * 更新一条记录 * * @param user */ public void updateUser(User user) { DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.update(user); } /** * 查询用户列表 */ public List<User> queryUserList() { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder<User> qb = userDao.queryBuilder(); List<User> list = qb.list(); return list; } /** * 查询用户列表 */ public List<User> queryUserList(int age) { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder<User> qb = userDao.queryBuilder(); qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age); List<User> list = qb.list(); return list; }}
DBManager dbManager = DBManager.getInstance(this); for (int i = 0; i < 5; i++) { User user = new User(); user.setId((long) i); user.setAge(i * 3); user.setName("第" + i + "人"); user.setTiem(String.valueOf(System.currentTimeMillis())); dbManager.insertUser(user); } List<User> userList = dbManager.queryUserList(); userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--before-->" + user.getId() + "--" + user.getName() +"--"+user.getAge()+ "--" + user.getTiem()); if (user.getId() == 0) { dbManager.deleteUser(user); } if (user.getId() == 3) { user.setAge(10); dbManager.updateUser(user); } } userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--after--->" + user.getId() + "---" + user.getName()+"--"+user.getAge() + "--" + user.getTiem()); }
0 0
- GreenDAO 3.0 数据库集成,使用,升级
- GreenDao使用CRUD及数据库结构升级
- Android GreenDao使用(三)数据库升级
- GreenDao数据库结构升级
- GreenDAO数据库版本升级
- GreenDAO数据库版本升级
- GreenDao数据库升级解决方案
- greendao数据库升级
- greenDao数据库升级
- Greendao 数据库升级解决方案
- GreenDao之数据库升级
- greenDao数据库升级
- GreenDao数据库升级
- GreenDao数据库升级方案
- greendao 数据库升级
- greenDao数据库升级
- GreenDao 数据库简单使用及数据库升级更新
- greendao 3.0集成和使用封装
- anaconda安装软件包出错的问题
- IE下radio的onchange事件移除焦点后方可触发问题
- 在外也能编程,几个实用的在线编译网站
- relocation介绍
- 如何在Ubuntu16.04上安装Rstudio
- GreenDAO 3.0 数据库集成,使用,升级
- python爬虫学习笔记
- Uploadify文件上传小实例
- 折半(二分)查找
- Quartz.NET Cron表达式用法一览
- JavaSE基础(基本数据类型)
- 一个简单的cmd命令
- android 新控件之SwipeRefreshLayout添加上拉加载和下拉刷新
- 【5】android底层驱动开发学习