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 table】start"); generateTempTables(database, daoClasses); printLog("【Generate temp table】complete"); 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 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 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() { }}
阅读全文
0 0
- Android GreenDao3.2.2版本初试
- android GreenDao3.2 版本示例程序
- Android GreenDao3.2.2简单使用
- android studio配置GreenDao3.2.2
- android GreenDAO3.2.2简单使用
- Android greenDao3.0的开发实战,包括版本升级(二)
- Android GreenDao3.2.0使用
- Android 深入GreenDao3.0
- 初试Android
- Android初试
- Android数据库框架-----GreenDao3的相关使用和版本升级更新
- Android Studio 版本迁移的配置问题以及 GreenDAO3.0的配置使用
- Android框架之路——GreenDao3.2.2的使用
- Android数据库GreenDAO3.2.2的使用(一,集成数据库)
- Android数据库GreenDAO3.2.2的使用(二,数据库使用)
- Android数据库GreenDAO3.2.2的使用(四、数据库升级)
- Android数据库——GreenDAO3.2.2的使用
- GreenDao3.2.2使用
- android SOCKET编程中出现connection reset
- 前端
- 二分查找模板
- laravel 使用递归实现无限分类(转自oschina姚棉伟原创)
- iOS第三方库汇总
- Android GreenDao3.2.2版本初试
- Mysql数据库的优化(主Sql优化)
- 常用的推荐算法解析
- java 消息机制 ActiveMQ入门实例
- react-native 布局
- 数组操作系列之循环去重
- webapp mui & HTML5+ (二) 之 mui
- IP协议
- Linux下编译PHP常见错误及解决方法