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
原创粉丝点击