Android GreenDao3.2.2版本初试

来源:互联网 发布:求数组最小值及其下标 编辑:程序博客网 时间:2024/05/21 17:26

1:配置

1)proect Gradle file:

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {        repositories {        google()        jcenter()        mavenCentral() // add repository    }    dependencies {        classpath 'com.android.tools.build:gradle:3.0.0'        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin                // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}allprojects {    repositories {        google()        jcenter()    }}task clean(type: Delete) {    delete rootProject.buildDir}
2:app gradle file:

apply plugin: 'com.android.application'android {    compileSdkVersion 26    defaultConfig {        applicationId "com.ares.xq.testgreemdao"        minSdkVersion 15        targetSdkVersion 26        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}// In your app projects build.gradle file:apply plugin: 'com.android.application'apply plugin: 'org.greenrobot.greendao' // apply plugindependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation 'com.android.support:appcompat-v7:26.1.0'    implementation 'com.android.support.constraint:constraint-layout:1.0.2'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'com.android.support.test:runner:1.0.1'    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'    implementation 'org.greenrobot:greendao:3.2.2' // add library}greendao {    schemaVersion 4 //对应当前数据库版本    daoPackage 'com.ares.xq.testgreemdao.dao'  // GreenDao自动生成代码所在的包名,默认的是在项目包下面新建一个gen    targetGenDir 'src/main/java/'   //设置自动生成代码的目录}

配置完成之后,直接Build-->Make Project;

2代码部分:

2-1: 实体类

package com.ares.xq.testgreemdao.entity;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;import org.greenrobot.greendao.annotation.Property;import org.greenrobot.greendao.annotation.Generated;/** * 数据库学生实体类 */@Entitypublic class StudentBean {    @Id(autoincrement = true)    private Long id;    @Property(nameInDb = "USERNAME")    private String name;    private int age;    private String fatherName;    @Override    public String toString() {        return "StudentBean{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                ", fatherName='" + fatherName + '\'' +                '}';    }    }

继续Build-->Make Project;生成dao类

2-1:MigrationHelper类

package com.ares.xq.testgreemdao;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.ref.WeakReference;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * * please call {@link #migrate(SQLiteDatabase, Class[])} or {@link #migrate(Database, Class[])} * */public final 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";    private static WeakReference<ReCreateAllTableListener> weakListener;    public interface ReCreateAllTableListener{        void onCreateAllTables(Database db, boolean ifNotExists);        void onDropAllTables(Database db, boolean ifExists);    }    public static void migrate(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) {        printLog("The Old Database Version" + db.getVersion());        Database database = new StandardDatabase(db);        migrate(database, daoClasses);    }    public static void migrate(SQLiteDatabase db, ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>... daoClasses) {        weakListener = new WeakReference<>(listener);        migrate(db, daoClasses);    }    public static void migrate(Database database, ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>... daoClasses) {        weakListener = new WeakReference<>(listener);        migrate(database, daoClasses);    }    public static void migrate(Database database, Class<? extends AbstractDao<?, ?>>... daoClasses) {        printLog("Generate temp tablestart");        generateTempTables(database, daoClasses);        printLog("Generate temp tablecomplete");        ReCreateAllTableListener listener = weakListener.get();        if (listener != null) {            listener.onDropAllTables(database, true);            printLog("Drop all table by listener");            listener.onCreateAllTables(database, false);            printLog("Create all table by listener");        } else {            dropAllTables(database, true, daoClasses);            createAllTables(database, false, daoClasses);        }        printLog("Restore datastart");        restoreData(database, daoClasses);        printLog("Restore datacomplete");    }    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 by reflect");    }    private static void createAllTables(Database db, boolean ifNotExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) {        reflectMethod(db, "createTable", ifNotExists, daoClasses);        printLog("Create all table by reflect");    }    /**     * 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);        }    }}
2-3:

package com.ares.xq.testgreemdao;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import org.greenrobot.greendao.database.Database;/** * Created by Administrator on 2017/10/30. */public class OpentHelper extends DaoMaster.OpenHelper {    public OpentHelper(Context context, String name) {        super(context, name);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        Log.i("TAG", "当前数据库版本oldVersion: " + oldVersion);        if (newVersion > oldVersion) {            MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {                @Override                public void onCreateAllTables(Database db, boolean ifNotExists) {                    DaoMaster.createAllTables(db, ifNotExists);                }                @Override                public void onDropAllTables(Database db, boolean ifExists) {                    DaoMaster.dropAllTables(db, ifExists);                }            }, StudentBeanDao.class, TecherBeanDao.class);        }    }}
2-4:

package com.ares.xq.testgreemdao;import android.util.Log;import com.ares.xq.testgreemdao.applocation.MyApplication;/** * Created by Administrator on 2017/10/30. */public class GreenDaoManager {    private DaoMaster mDaoMaster;    private DaoSession mDaoSession;    private static volatile GreenDaoManager mInstance = null;    private GreenDaoManager() {        if (mInstance == null) {            OpentHelper devOpenHelper = new OpentHelper(MyApplication.getInstince(), "yyc_user.db");            mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());            mDaoSession = mDaoMaster.newSession();            Log.i("TAG", "初始化数据库...");        }    }    public static GreenDaoManager getInstance() {        if (mInstance == null) {            synchronized (GreenDaoManager.class) {                if (mInstance == null) {                    mInstance = new GreenDaoManager();                }            }        }        return mInstance;    }    public DaoMaster getMaster() {        return mDaoMaster;    }    public DaoSession getSession() {        return mDaoSession;    }    public DaoSession getNewSession() {        mDaoSession = mDaoMaster.newSession();        return mDaoSession;    }}
2-5:

package com.ares.xq.testgreemdao.applocation;import android.app.Application;import com.ares.xq.testgreemdao.GreenDaoManager;/** * Created by Administrator on 2017/10/30. */public class MyApplication extends Application {    private static MyApplication mMyApplication;    @Override    public void onCreate() {        super.onCreate();        mMyApplication = this;        GreenDaoManager.getInstance();    }    public static MyApplication getInstince() {        return mMyApplication;    }}

使用:

package com.ares.xq.testgreemdao;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import com.ares.xq.testgreemdao.entity.StudentBean;import com.ares.xq.testgreemdao.entity.TecherBean;import java.util.List;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        techer();    }    private void init() {        StudentBeanDao sdao = GreenDaoManager.getInstance().getNewSession().getStudentBeanDao();        insert(sdao);        selectDao(sdao);    }    private void techer() {        TecherBeanDao tdao = GreenDaoManager.getInstance().getNewSession().getTecherBeanDao();        TecherBean bean = new TecherBean();        bean.setClassName("二年级1");        bean.setName("刘老师");        tdao.insert(bean);        List<TecherBean> list = tdao.loadAll();        if (list != null && list.size() > 0) {            for (int i = 0; i < list.size(); i++) {                Log.i("TAG", list.get(i).toString());            }        }    }    /**     * 插入数据     *     * @param     */    private void insert( StudentBeanDao sdao) {        StudentBean bean = new StudentBean();        bean.setAge(11);        bean.setName("lily");        sdao.insert(bean);    }    /**     * 查询     */    private void selectDao(StudentBeanDao sdao) {        List<StudentBean> list =sdao.loadAll();        if (list != null && list.size() > 0) {            for (StudentBean bean : list) {                Log.i("TAG", bean.toString());            }        } else {            Log.i("TAG", "LIST IS NULL");        }    }    private void update() {    }}